《java web實習報告.doc》由會員分享,可在線閱讀,更多相關《java web實習報告.doc(23頁珍藏版)》請在裝配圖網(wǎng)上搜索。
java web實習報告
目錄
第一篇:java web 開發(fā)技術實驗報告模版
第二篇:java web課程設計實訓報告
第三篇:java web郵件學習
第四篇:java web總結(jié)
第五篇:java web總結(jié)
正文
第一篇:java web 開發(fā)技術實驗報告模版
項目綜合實踐報告 題目:html+css 旅游門戶網(wǎng)站設計
班級:計算機XX(1)姓名:丁一學號:954211完成日期:XX.9.14
一、分析設計
用文字、圖表等說明設計思路及設計結(jié)果。
二、主要源代碼
html
css
三、效果圖
屏幕抓圖
四、調(diào)試過程
(調(diào)試過程中碰到的問題及解決方法)
五、實驗結(jié)論
1、實驗結(jié)果圖
2、實驗心得體會
第二篇:java web課程設計實訓報告
java web課程設計實訓報告
我們進行了為期一周的java web的課程實訓。在這次實訓中,我覺得我學到了很多東西。這次,老師給我們安排了一個項目,是關于商店購物的。首先,我們劃分了幾個小組,每組4-6人,每個人有每個人的工作,每個人的工作完成后整合到一起,這個項目就完成了。我在我們小組的工作是寫一段刪除商品的java代碼。因為我的基礎比較差,所以我分擔的工作比較少,下面是我做的一段代碼:
public void deleteproduct(string id) {
statement stmt = null;
connecttodb();
int tempid =
integer.parseint(id);
try {
stmt =
this.con.createstatement();
stmt.execute("delete from
shop_info where product_id=" + tempid);
} catch (exception e) {
e.printstacktrace();
} finally {
close(this.con, stmt, null); }}
總而言之,這次實訓對我的幫助很大,我工作會很有從中學到了什么是團隊協(xié)作,正所謂團結(jié)就是力量,不僅如此,我還學到了很多的專業(yè)知識,積累了一些經(jīng)驗。我想,對于我以后的工作會很有幫助,希望還能有更多像這樣的機會讓我能夠鍛煉我自己。
第三篇:java web郵件學習
mons-fileupload-1.1.1.jar 上傳文件總結(jié):
1、 驗證是否要處理的是上傳文件
servletfileupload.ismultipartcontent(request)
2、 創(chuàng)建diskfileitemfactory 對象并對其初始化設置
diskfileitemfactory factory = new diskfileitemfactory();
factory.setsizethreshold(20 * 1024);
factory.setrepository(factory.getrepository());
3、 創(chuàng)建servletfileupload 對象并設置其編碼方式
servletfileupload upload = new servletfileupload(factory);
upload.setheaderencoding("gbk");
4、 開始獲取上傳文件的集合:
formlists = upload.parserequest(request);
5、 設置上傳文件允許的大小
int size = 2 * 1024 * 1024;
6、 循環(huán)遍歷formlists集合來根據(jù)其元素的類型(普通表單域還是文件域)進行賦值還是上傳功能 iterator iter = formlists.iterator();
while (iter.hasnext()) {
fileitem formitem = (fileitem) iter.next(); 7、 是文件域則執(zhí)行上傳:
具體做法:(1)、獲取文件路徑全名:string name = formitem.getname();
(2)、判斷文件名后綴是否符合要求:!name.endswith("mp3")
(3)、判斷文件大小是否符合要求formitem.getsize() > size
if/else(4)、都符合要求則上傳:
第一步:判斷文件的名稱不能為空(formitem.getname())、大小不能為0
(formitem.getsize()),如果不符合要求則continue執(zhí)行下一循環(huán)
第 二步: 獲取文件的單純文件名稱: name.substring(name.lastindexof("\")
+ 1, name.length());
第 三步: 設置保存到的服務器地址:filedir ("file/") + "\" + 單純名稱;file savefile = new file(服務器地址);
第 四步: 上傳: formitem.write(savefile);
、 是普通表單域則將表單項的值賦值給相關對象變量,如(更多內(nèi)容請訪問好范 文網(wǎng):..)javabean(每一次循環(huán)將該次對應的表單項的值付
給適當?shù)淖兞繉ο?
string formname = formitem.getfieldname(); 獲取普通表單項的名稱
string con = formitem.getstring("gbk");
用formname.equals(““)來判斷
下載文件具體方法:
1、 獲取服務器下載地址并將此地址字符串進行編碼:
string path=request.getparameter("path");
2、 創(chuàng)建下載目錄:
file file = new file(path);獲取普通表單項的值并編碼 path=new string(path.getbytes("iso-8859-1"));
3、 創(chuàng)建文件字節(jié)輸入流
inputstream in = new fileinputstream(file);
4、 創(chuàng)建輸出流對象
outputstream os = response.getoutputstream();
5、 設置該輸出流的應大頭、編碼等配置
response.addheader("content-disposition", "attachment;filename="
+ new string(file.getname().getbytes("gbk"),"iso-8859-1"));
response.addheader("content-length", file.length() + ""); response.setcharacterencoding("gbk");
6、 開始下載:
int data = 0;
while ((data = in.read()) != -1)
{ os.write(data); }
7、 關閉輸入輸出流
os.close();
in.close();
郵件接收的方法:
dao:
1、 創(chuàng)建郵件接收類:store
思路:創(chuàng)建properties類并添加屬性->創(chuàng)建session對象->創(chuàng)建store對象并連接到服務器和編寫關閉方法
2、 獲取全部已讀郵件的名稱集合的方法 返回string
3、 獲取全部已讀或未讀郵件的內(nèi)容的方法返回list(包含郵件信息和附件狀態(tài),但不包含具體附件內(nèi)容) 思路: 獲取store對象->獲取pop3folder對象->打開pop3folder郵件夾->創(chuàng)建fetchprofile預提取對象并對其添加兩個常用屬性->定義message[]對象數(shù)組并設為null->獲取全部已讀郵件的uid字符串->若字符串不為空則->轉(zhuǎn)換為數(shù)組并進行排序->根據(jù)要求的已讀或者未讀條件來獲取全部已讀或未讀郵件信息給message[] (folder.search)->后退三步-若字符串為空則->獲取全部未讀郵件信息message[]---?開始提取上述郵件數(shù)組中每一個郵件的詳細信息->循環(huán)遍歷message[]數(shù)組->定義mimemessage對象并賦值為數(shù)組元素->獲取郵件id、發(fā)件人、郵件時間->根據(jù)編碼類型獲取郵件主題->由自定義方法獲取此郵件的附件對象(string[])->message[i].getflags().getsystemflags().tostring();->如果判斷返回的郵件有附件,則獲取附件設置為1,否則設置為0(來控制頁面中的附件圖標的顯示)->將此郵件信息對象添加到list中。
4、 向數(shù)據(jù)庫中添加已讀郵件的標記的方法:iduid address
5、 獲取指定郵件中附件的方法:此方法中重點是對郵件內(nèi)容的編碼處理,故這里重點介紹主要功能語法: 思路:(1)定義該郵件名稱對應的所有附件連接字符串為超鏈接(附件之間用空格隔開)(string,由多個”附件序號=&附件名稱=&郵件序號”組成),定義郵件名稱字符串(已知條件)
(2) multipart multipart = (multipart) part.getcontent();得到該郵件所有的內(nèi)容集合,然后對其遍歷以獲取每一個multipart中每一個bodypart->判斷此bodypart是否為附件,若是附件則獲取該附件的名稱 并添加到(1)中的連接字符串中,連接字符串中附件序號為遍歷變量j
最后: int counts = multipart.getcount();
bodypart對象的個數(shù) //返回mimemultipart對象中保存的//關閉流 response.setcontenttype("application/octet-stream");
for (int i = 0; i < counts; i++) {} getmailattach(multipart.getbodypart(i), emailv);
并返回string[] obj = { 郵件主題內(nèi)容, filename1 };
6、 對輸入的utf7編碼的內(nèi)容進行轉(zhuǎn)碼的方法
servlet:
下載附件servlet:
思路:設置response.setcontenttype("text/html;charset=gbk")、
request.setcharacterencoding("gbk")->創(chuàng)建httpsession對象->創(chuàng)建servletoutputstream對象->獲取頁面?zhèn)鬟f變量:附件序號、附件名稱;獲取session變量"message"->將附件名稱進行編碼處理:filename=new
string(filename.getbytes(),"iso-8859-1")->response.setheader("content-disposition","attachment;filename="+filename)->由”message”獲取multipart對象->由multipart對象獲取bodypart對象->由bodypart對象獲取inputstream對象->開始下載:
int c=0;
while((c=is.read())!=-1){out.write(c);}
收取郵件servlet(郵件的全部具體信息):
1、 郵箱登陸的驗證方法:
思路:獲取表單傳遞值的host username pwd->用dao(1)中的方法進行用戶驗證如果正確->創(chuàng)建httpsession對象->用session.setattribute的方法保存登陸的用戶信息(以上三個)->
store.close();
2、 獲取當前分頁頁面中已讀或未讀的全部郵件的集合(包含郵件信息和附件狀態(tài),但不包含具體附件內(nèi)容) 思路:創(chuàng)建httpsession對象,并獲session變量host username pwd和request變量"flag"和"page"-> request.setattribute("flag", flag)->根據(jù)request變量”page”來判斷是否已經(jīng)開始分頁瀏覽->若沒有則先執(zhí)行dao(3)方法獲取已讀或未讀的全部郵件集合,然后執(zhí)行自定義分頁類中的初始化方法獲取上述集合中的第一頁中的郵件集合,并request.getsession().setattribute("pagination", 分頁類的實例化);->若已經(jīng)開始分頁,則將當前頁page賦值為已經(jīng)存在的session類型的分頁類對象中的getpage方法中返回的page,并且執(zhí)行自定義分頁類中的類似初始化方法的獲取當前頁面集合的方法(具體看程序)
3、 查看郵件詳細信息:(獲取指定郵件的信息)
思路:同dao(3)中的方法相似 不同之處是:dao(3)查詢的是全部已讀或未讀 而本案查詢的是指定的郵件id tools:
本案中主要為分頁類的編寫:
1、 初始化獲取第一頁的集合
2、 獲取已分頁的當前頁面的集合
3、 獲取全部記錄數(shù)
4、 獲取最大頁數(shù)
5、 獲取當前頁數(shù)
6、 獲取分頁導航
第四篇:java web總結(jié)
java web 總結(jié)
1.jsp運行原理
(1)用戶通過客戶端瀏覽器向服務器發(fā)送請求。
(2)jsp文件將jsp引擎編譯成java的class文件,即servlet。
(3)將產(chǎn)生的servlet加載到內(nèi)存執(zhí)行。
(4)servlet的運行結(jié)果以html(或xml)形式通過web服務器返回客戶端的瀏覽器。
2.web項目設計
(1)公開目錄(2)web_inf目錄(3)class目錄
3.jsp的基本語法
(1)腳本元素:聲明、腳本段、表達式。
(2)腳本段:<%%>
(3)聲明:<%!%>不會產(chǎn)生任何輸出內(nèi)容→聲明全局變量。
(4)表達式:<%= %>
(5)el表達式:${ }
(6)指令元素:<% @ %>不在客戶端可見
(7)page指令、include指令、taglib指令
page指令:language屬性、contenttype(text/html)、text/plain application/ms、application/x-msexecl、pageencoding、info、import屬性.
include指令:在jsp頁面中靜態(tài)包含一個文件 <@include file=""%>taglib指令: <%@taglib uri="標記庫的uri地址" prefix="前綴名"%> 指令元素翻譯階段執(zhí)行,動作元素執(zhí)行階段被執(zhí)行。
用于包含其他文件可以是靜態(tài)文件,也可以是動態(tài)文件。 ?包含動態(tài)文件時
用傳 (建一值)
考點:
4.指令與動作的區(qū)別(include)
1.執(zhí)行時間不同
指令<%@ include file=" "%>是偏譯時包含靜態(tài)文件
動作?是運行時包含的文件
2.引入內(nèi)容不同
指令<%@include file="relatirveuri"%>引入靜態(tài)文本(html.jsp)。
動作引入執(zhí)行頁面或severlet的應答文本。
5.jsp內(nèi)置對象
out,request,response,session,application,page,pagecontext,exception,config
request客戶端向服務端發(fā)送請求。
response用于服務器端封裝jsp處理請求后產(chǎn)生的結(jié)果。
response對象的send redirect(url)方法相當于兩次請求。
而在網(wǎng)址不變情況下內(nèi)部跳轉(zhuǎn)不同頁面,但依舊屬于同一次請求
6.session和cookie的區(qū)別
1.存放地點不同
session存放在服務器端,cookie存放在客戶端的硬盤里
2.存活時間
session隨用戶訪問服務器而產(chǎn)生,隨客戶下線或超時而消失
3.安全性
session存放在服務器端,不能被修改,且隨客戶端瀏覽器的關閉而消失,安全性較好。cookie存放在客戶端,安全性較差。
7.數(shù)據(jù)庫
java.sql.driver
java.sql.drivermanager——加載驅(qū)動程序
java.sql.connetion——表示數(shù)據(jù)庫連接對象,對數(shù)據(jù)庫一切操作都在這個基礎上
java.sql.statement——執(zhí)行sql語句和返回結(jié)果
java.sql.resultset——結(jié)果集用來暫時存放數(shù)據(jù)庫查詢操作結(jié)果
8.編寫程序的步驟
1.裝載驅(qū)動程序
class.forname(".mysql.jdbc.driver")
2.定義所需連接數(shù)據(jù)庫的地址
string mysqlurl="jdbc.mysql://host:port/dbname"
3.建立與數(shù)據(jù)庫的連接
connection conn=drivermannager.get connection(url,"登錄數(shù)據(jù)庫用戶名","
密碼")
4.聲明并執(zhí)行sql語句
5.處理返回的結(jié)果
6.關閉對象
string driverstr=".mysql.jdbc.driver"
string connstr="jdbc:mysql://localhost:3306/book";
class forname(driver str)
connection conn=drivermanager.getconnection(connstr."root"."123") 第4步:建立語句對象
statement stmt=conn.createstatement()
第5步:聲明并執(zhí)行sql語句
string sql="select*from book";
resultset rs=stmt.executequery( sql);
第6步:
statement接口的3個方法:1、resultset executequery(string sql)
2、int execute update(string sql)
3、boolean execute(string sql)
resultset的方法:1、boolean next()
2、get xxx()
第7歩:rs.close()stmt.close()con.close()
注:關閉資源的順序與打開資源順序恰好相反。
第8步:異常處理
try{.........}catch(sqlexecption ex){.........}
9.java bean 組件(可重用)
組件:是一個獨立的模塊,外界可以不了解內(nèi)部如何實現(xiàn),只需通過其提供的接口對組件進行訪問即可,組件可重用。
特點:1、實現(xiàn)代碼重復使用;2、易編寫,易維護,易使用。
10.java bean類的編碼約定
1、類實現(xiàn)了java.io.serializable接口
2、必須放在某個package(包)中
3、類中如果有構(gòu)造方法,那么這個方法是共有的,并且無參數(shù)
4、所有屬性都是私有的(private修飾)
5、get xxx:用來獲取屬性,此方法是共有的
6、set xxx:用來設置屬性,此方法是共有的
7、對于boolean類型的成員變量允許使用“is”代替“get”和“set”
8、類中的普通方法不適合上面的命名規(guī)則,但這個方法必是public的。
3個標記:
網(wǎng)頁中創(chuàng)建javabean實例
用于為bean中的屬性賦值
用于獲取bean中屬性的值
id=”javabean實例名”class=”javabean對應的類名” 設置的屬性
獲取javabean實例指令的屬性值,并將這個值轉(zhuǎn)換成字符串顯示到jsp頁面。
11.servlet的生命周期
(1)當客戶第一次請求servlet時,servlet被加載到內(nèi)存 容器會創(chuàng)建servlet實例,并調(diào)用其init()方法進行初始化工作。
(2)容器創(chuàng)建請求對象,然后調(diào)用servlet的service()方法為客戶提供服務。
(3)當servlet不再被需求時,容器調(diào)用servlet的destory()方法將servlet實例銷毀。
12.servlet開發(fā)
引入import.javax.servlet.* 和import.javax,servlet.http.*包
13.servlet過濾器
servlet過濾器是一種java組件,它位于客戶端和處理程序之間
servlet過濾器工作原理
14.model1和model2
model1:jsp+javabean
model2:jsp+servlet+javabean
model1中,jsp頁面實現(xiàn)頁面顯示、業(yè)務邏輯和流程控制,數(shù)據(jù)處理由javabean完成。
優(yōu)點:進行快速和小規(guī)模的應用開發(fā)時優(yōu)勢非常明顯。
缺點:不利于web應用的擴展和更新;調(diào)試和排錯困難。
model2中,mvc模式--->模型-視圖-控制器.即把web應用的輸入輸出和處理流程按照model.view和controller分成三層。
model1和model2的區(qū)別:
model1和model2實際上就是對采用jsp技術開發(fā)的web應用的不同模型的描述。model1采用jsp+javabean技術開發(fā)web應用,它比較適合小規(guī)模應用的開發(fā),效率較高,易于實現(xiàn),但由于在jsp頁面中內(nèi)嵌了大量的java代碼,以至于當業(yè)務邏輯復雜時,代碼可維護性、可擴展性和可重用性就會下降;model2采用jsp+servlet+javabean技術開發(fā)web應用,該模型基于mvc模式,完全實現(xiàn)了頁面顯示和邏輯的分離,它充分利用了jsp和servlet兩種技術的優(yōu)點,jsp更適合前臺頁面的開發(fā),而servlet更擅長服務器端程序的編寫,model2分工明確,更適合大型項目的開發(fā)和管理。
視圖(view)用于與用戶交互,可以用html.jsp實現(xiàn)。
15.模型(model)用于表示業(yè)務數(shù)據(jù)和實現(xiàn)業(yè)務邏輯,可以用javabean實現(xiàn) 控制器(controller)完成流程控制,它接收來自視圖層用戶輸入的數(shù)據(jù),并調(diào)用相應的模型進行處理,最后選擇合適的視圖去響應用戶。控制層可以用servlet實現(xiàn)。
優(yōu)點:mvc模式完全實現(xiàn)了頁面表示和業(yè)務邏輯的分離;
mvc優(yōu)勢之一在于三層各司其職,互不干涉。
缺點:沒有明確的定義。
模型層為javabean,實現(xiàn)了數(shù)據(jù)的表示和業(yè)務邏輯,視圖層為jsp頁面,只負責顯示功能。
控制器為servlet,負責接收用戶的請求,設置javabean屬性,調(diào)用javabean完成業(yè)務處理,最后將處理結(jié)果交給jsp頁面顯示。
16.自定義標簽
對隱式對象的操作、處理表單、訪問數(shù)據(jù)庫及其他企業(yè)級服務。
自定義標簽種類:
1.不帶有屬性和標簽體:
2.帶有屬性沒有標簽體的標簽:
3.帶有屬性帶有標簽體:mybody
17.el表達式
基本語法${expr}
功能:對屬性對象的簡明訪問:${user}
對屬性對象的屬性訪問:${customer.firstname}
對屬性集合元素的訪問:對數(shù)組和list:${variable[index]}對map:${variable[key]}
對請求參數(shù)cookie等的簡單訪問.
請求參數(shù)${param.custid}
cookie對象:${cookie.usercookie}
18."."操作符和"[ ]"操作符
${user.address}=${user[address]}
訪問數(shù)組和集合元素,需使用[ ]
${class[0].name}=${class[0][name]}
${param.username}={%=request.getparameter("username")%}
19."."與"[ ]"使用存在差異
1.當訪問的數(shù)據(jù)中包含一個特殊字符(如:"."或"_"時),就必須用"[ ]"操作符
2.當動態(tài)取值時必須使用"[ ]"操作符,"."操作符只能取到靜態(tài)的值
注:當"[ ]"操作符中的屬性名為常量時必須用引起,否則將會當做變量來處理.
20.sql標簽
1.標簽
2.執(zhí)行數(shù)據(jù)庫查詢
3.執(zhí)行數(shù)據(jù)庫更新
4.和指明參數(shù)值
5.用于事務處理
21. tomcat的目錄結(jié)構(gòu)及描述:
bin放置啟動和關閉tomcat的可執(zhí)行文件和批處理文件
mon放置在此目錄中的jar、class文件,可以被此服務器下所有的web應用使用
conf放置tomcat的主要配置文件
logs放置tomcat的日志文件
server放置tomcat管理接口的應用
src放置tomcat相關的源代碼
temp放置tomcat臨時文件
webapps 放置tomcat應用的目錄
work放置jsp頁面翻譯成對應的servlet類的目錄
第五篇:java web總結(jié)
java web 總結(jié)
一
servlet的繼承層次很多,但是我們web開發(fā)常用的也就是javax.servlet.http.httpservlet這個類,我們常用的 兩個請求方法是doget(),dopost(),還有從父類繼承過來的方法init()初始化,destroy()servlet銷毀時會被調(diào) 用,getservletconfig()獲得servletconfig對象,getservletinfo()返回有關servlet的信息,包括作 者、servlet版本等。
servlet的訪問必須在web.xml,怎么配置會在下面舉例。 常用方法:
1、request.setcharacterencoding("utf-8");//設置用post傳遞給服務器的參數(shù)編碼方式
2、response.setcontenttype("text/html;charset=utf-8");//設置發(fā)送給瀏覽器的內(nèi)容編碼
3、httpsession session = request.getsession();//獲得session會話session.setattribute("a","b");//給session作用域中存值可以這樣取值:session.getattribute("a");
4、servletcontext context = this.getservletcontext();整個web應用對象,或者用servletconfig對象.getservletcontext()獲得
string str = context.getinitparameter("encoding");//獲得全局參數(shù)
5、servletconfig config = this.getservletconfig("p1");//獲得某個servlet專用的配置對象
string str =config.getinitparameter("p2");//獲得某個servlet的專有配置參數(shù)
6、string str = request.getparameter("s");//獲得頁面?zhèn)鬟^來的參數(shù)
7、string[] sa = request.getparametervalues("sa");//獲得字符串數(shù)組
8、request.setattribute("r","寶寶");//往request作用域中存值。在頁面可以${r}這樣取出寶寶。
9、printwriter out = response.getwriter();//獲得標準輸出流,此流內(nèi)部做了處理直接會輸出給瀏覽器。
10、request.getrequestdispatcher("/index.jsp").forward(request,response);//轉(zhuǎn)發(fā)response.sendredirect("index.jsp");跳轉(zhuǎn)
二
連接數(shù)據(jù)庫的基本過程
加載驅(qū)動程序
創(chuàng)建連接對象
創(chuàng)建語句對象
編寫sql語句
使用語句對象執(zhí)行sql語句
如果有結(jié)果集對結(jié)果集進行處理
關閉結(jié)果集對象(如果有),關閉語句對象,關閉連接對象
如何加載驅(qū)動程序
class.forname(“驅(qū)動程序名字”):
如何創(chuàng)建連接
通過drivermanager的getconnection方法,有3個參數(shù),第一個參數(shù)是url,第二個參數(shù)是用戶名,第三個參數(shù)是口令。
三
http 是一個屬于應用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過幾年的使用與發(fā)展,得到不斷地完善和 擴展。目前在中使用的是http/1.0的第六版,http/1.1的規(guī)范化工作正在進行之中,而且http-ng(next generation of http)的建議已經(jīng)提出。
http協(xié)議的主要特點可概括如下:
1.支持客戶/服務器模式。
2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有get、head、post。每種方法規(guī)定了客戶與服務器聯(lián)系的類型不同。由于http協(xié)議簡單,使得http服務器的程序規(guī)模小,因而通信速度很快。
3.靈活:http允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒫ontent-type加以標記。
4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
5.無狀態(tài):http協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務處理沒有記憶
能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
默認
java web 流程
java web復習
java web 大題(新)
java web測試題
java實習報告
第 23 頁 共 23 頁
鏈接地址:http://ioszen.com/p-4022379.html