【Servlet】ServletContext、ServletConfig对象学习、用户登录系统完善
總結(jié):request、cookie、session、context的區(qū)別
這四個(gè)對(duì)象有不同級(jí)別的作用域和生命周期。
(1)request:解決了一次請(qǐng)求內(nèi)的數(shù)據(jù)共享問題(作用域:一次請(qǐng)求)
(2)cookie:解決了同一用戶不同請(qǐng)求的數(shù)據(jù)共享的問題(作用域:一次會(huì)話/或者設(shè)置定時(shí))
Cookie c = new Cookie("uname", "張三"); // 創(chuàng)建Cookie對(duì)象c.setPath("CookieServlet"); // 指定共享cookie的Servletresp.addCookie(c); // 將cookie添加到響應(yīng)對(duì)象中(3)session:解決了同一用戶不同請(qǐng)求的數(shù)據(jù)共享問題(作用域:會(huì)話創(chuàng)建->瀏覽器關(guān)閉)
// session 技術(shù)是依賴Cookie 技術(shù)的服務(wù)器端的數(shù)據(jù)存儲(chǔ)技術(shù)// cookie存儲(chǔ)在本地瀏覽器,而session存儲(chǔ)在服務(wù)器HttpSession hs=req.getSession(); // 在servlet中獲取session對(duì)象hs.setAttribute("uname","張三"); // 數(shù)據(jù)存儲(chǔ)(4)context:解決了不同用戶的數(shù)據(jù)共享問題(作用域:服務(wù)器啟動(dòng)->服務(wù)器關(guān)閉)
ServletContext sc=this.getServletContext(); // 在servlet中獲取context對(duì)象sc.setAttribute("str", "ServletContext對(duì)象學(xué)習(xí)");// 數(shù)據(jù)存儲(chǔ)ServletContext / ServletConfig 對(duì)象學(xué)習(xí)
通過前面知識(shí)點(diǎn)的學(xué)習(xí),我們對(duì)于請(qǐng)求的處理已經(jīng)可以說比較靈活了,但是還不夠。我們?cè)俳榻B兩個(gè)重要的對(duì)象:ServletContext 對(duì)象和ServletConfig 對(duì)象
ServletContext 對(duì)象:
問題:
Request 解決了一次請(qǐng)求內(nèi)的數(shù)據(jù)共享問題,session 解決了用戶不同請(qǐng)求的數(shù)據(jù)共享問題,那么不同的用戶的數(shù)據(jù)共享該怎么辦呢?
解決:
使用ServletContext 對(duì)象
作用:
解決了不同用戶的數(shù)據(jù)共享問題
原理:
ServletContext 對(duì)象由服務(wù)器進(jìn)行創(chuàng)建,一個(gè)項(xiàng)目只有一個(gè)對(duì)象。不管在項(xiàng)目的任意位置進(jìn)行獲取得到的都是同一個(gè)對(duì)象,那么不同用戶發(fā)起的請(qǐng)求獲取到的也就是同一個(gè)對(duì)象了,該對(duì)象由用戶共同擁有。
特點(diǎn):
服務(wù)器進(jìn)行創(chuàng)建
用戶共享
一個(gè)項(xiàng)目只有一個(gè)
生命周期:
服務(wù)器啟動(dòng)到服務(wù)器關(guān)閉
作用域:
項(xiàng)目內(nèi)
使用:
獲取ServletContext 對(duì)象
使用作用域進(jìn)行共享數(shù)據(jù)流轉(zhuǎn)
獲取web.xml 中的全局配置
獲取webroot 下項(xiàng)目資源流對(duì)象
獲取webroot 下資源絕對(duì)路徑
案例:
網(wǎng)頁瀏覽器次數(shù)統(tǒng)計(jì),詳見源碼
代碼示例
(1)ServletContextServlet.java
package com.bjsxt.servlet;import java.io.IOException; import java.io.InputStream;import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /*** ServletContext對(duì)象學(xué)習(xí):* 問題:* 不同的用戶使用相同的數(shù)據(jù)* 解決:* ServletContext對(duì)象* 特點(diǎn):* 服務(wù)器創(chuàng)建* 用戶共享* 作用域:* 整個(gè)項(xiàng)目內(nèi)* 生命周期:* 服務(wù)器啟動(dòng)到服務(wù)器關(guān)閉* 使用:* 獲取ServletContext對(duì)象* //第一種方式:ServletContext sc=this.getServletContext();//第二種方式:ServletContext sc2=this.getServletConfig().getServletContext();//第三種方式:ServletContext sc3=req.getSession().getServletContext();* 使用ServletContext對(duì)象完成數(shù)據(jù)共享* //數(shù)據(jù)存儲(chǔ)* sc.setAttribute(String name, Object value);* //數(shù)據(jù)獲取* sc.getAttribute("str") 返回的是Object類型* 注意:* 不同的用戶可以給ServletContext對(duì)象進(jìn)行數(shù)據(jù)的存取。* 獲取的數(shù)據(jù)不存在返回null。* 獲取項(xiàng)目中web.xml文件中的全局配置數(shù)據(jù)* sc.getInitParameter(String name); 根據(jù)鍵的名字返回web.xml中配置的全局?jǐn)?shù)據(jù)的值,返回String類型。* 如果數(shù)據(jù)不存在返回null。* sc.getInitParameterNames();返回鍵名的枚舉* 配置方式:注意 一組<context-param>標(biāo)簽只能存儲(chǔ)一組鍵值對(duì)數(shù)據(jù),多組可以聲明多個(gè) <context-param>進(jìn)行存儲(chǔ)。* <context-param><param-name>name</param-name><param-value>zhangsan</param-value></context-param>作用:將靜態(tài)數(shù)據(jù)和代碼進(jìn)行解耦。獲取項(xiàng)目webroot下的資源的絕對(duì)路徑。String path=sc.getRealPath(String path); 獲取的路徑為項(xiàng)目根目錄,path參數(shù)為項(xiàng)目根目錄中的路徑獲取webroot下的資源的流對(duì)象InputStream is = sc.getResourceAsStream(String path);注意:此種方式只能獲取項(xiàng)目根目錄下的資源流對(duì)象,class文件的流對(duì)象需要使用類加載器獲取。path參數(shù)為項(xiàng)目根目錄中的路徑* * * @author MyPC**/ public class ServletContextServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//獲取ServletContext對(duì)象//第一種方式:ServletContext sc=this.getServletContext();//第二種方式:ServletContext sc2=this.getServletConfig().getServletContext();//第三種方式:ServletContext sc3=req.getSession().getServletContext();System.out.println(sc==sc2);System.out.println(sc==sc3);//使用ServletContext對(duì)象完成數(shù)據(jù)共享//數(shù)據(jù)存儲(chǔ)sc.setAttribute("str", "ServletContext對(duì)象學(xué)習(xí)");//獲取項(xiàng)目web.xml的全局配置數(shù)據(jù)String str = sc.getInitParameter("name2");System.out.println("全局配置參數(shù):"+str);//獲取項(xiàng)目根目錄下的資源的絕對(duì)路徑//String path="D:\\apache-tomcat-7.0.56\\webapps\\sc\\doc\\1.txt";String path=sc.getRealPath("/doc/1.txt");System.out.println(path);//獲取項(xiàng)目根目錄下資源的流對(duì)象InputStream is = sc.getResourceAsStream("/doc/1.txt");} }(2)ServletContextServlet2.java
package com.bjsxt.servlet;import java.io.IOException;import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class ServletContextServlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//創(chuàng)建ServletContext對(duì)象ServletContext sc=this.getServletContext();//獲取數(shù)據(jù)System.out.println("ServletContextServlet2.service()"+sc.getAttribute("str"));} }ServletConfig 對(duì)象:
問題:
使用ServletContext 對(duì)象可以獲取web.xml 中的全局配置文件,在web.xml 中
每個(gè)Servlet 也可以進(jìn)行單獨(dú)的配置,那么該怎么獲取配置信息呢?
解決:
使用ServletConfig 對(duì)象
作用:
ServletConfig 對(duì)象是Servlet 的專屬配置對(duì)象,每個(gè)Servlet 都單獨(dú)擁有一個(gè)ServletConfig 對(duì)象,用來獲取web.xml 中的配置信息。
使用:
獲取ServletConfig 對(duì)象
獲取web.xml 中servlet 的配置信息
代碼示例
(1)web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>07-ServletConfig</display-name><servlet><servlet-name>ServletConfigServlet</servlet-name><servlet-class>com.bjsxt.servlet.ServletConfigServlet</servlet-class><init-param><param-name>config</param-name> <!-- 在這里(項(xiàng)目內(nèi))配置ServletConfig需要獲取的內(nèi)容:鍵 --><param-value>utf-8</param-value> <!-- 在這里(項(xiàng)目內(nèi))配置ServletConfig需要獲取的內(nèi)容:值 --></init-param></servlet><servlet-mapping><servlet-name>ServletConfigServlet</servlet-name><url-pattern>/sg</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list> </web-app>(2)ServletConfigServlet.java
package com.bjsxt.servlet;import java.io.IOException;import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /*** ServletConfig對(duì)象學(xué)習(xí):* 問題:* 如何獲取在web.xml中給每個(gè)servlet單獨(dú)配置的數(shù)據(jù)呢?* 解決:* 使用ServletConfig對(duì)象* 使用:* 獲取ServletConfig對(duì)象* 獲取web.xml中的配置數(shù)據(jù)* @author MyPC**/ public class ServletConfigServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//獲取ServletConfig對(duì)象ServletConfig sc=this.getServletConfig();//獲取web.xml中的配置數(shù)據(jù)String code=sc.getInitParameter("config");System.out.println(code);} }LoginServlet檢測(cè)思路:
* 請(qǐng)求中文亂碼解決:* 1、使用String進(jìn)行數(shù)據(jù)重新編碼* uname=new String(uname.getBytes("iso8859-1"),"utf-8");* 2、使用公共配置* get方式:* 步驟一:req.setCharacterEncoding("utf-8");* 步驟二:* 在tomcat的目錄下的conf目錄中修改server.xml文件:在Connector標(biāo)簽中增加屬性 useBodyEncodingForURI="true"* post方式:* req.setCharacterEncoding("utf-8");* Servlet流程總結(jié):* 瀏覽器發(fā)起請(qǐng)求到服務(wù)器(請(qǐng)求)* 服務(wù)器接受瀏覽器的請(qǐng)求,進(jìn)行解析,創(chuàng)建request對(duì)象存儲(chǔ)請(qǐng)求數(shù)據(jù)* 服務(wù)器調(diào)用對(duì)應(yīng)的servlet進(jìn)行請(qǐng)求處理,并將request對(duì)象作為實(shí)參傳遞給servlet的方法* servlet的方法執(zhí)行進(jìn)行請(qǐng)求處理* //設(shè)置請(qǐng)求編碼格式* //設(shè)置響應(yīng)編碼格式* //獲取請(qǐng)求信息* //處理請(qǐng)求信息* //創(chuàng)建業(yè)務(wù)層對(duì)象* //調(diào)用業(yè)務(wù)層對(duì)象的方法* //響應(yīng)處理結(jié)果*請(qǐng)求轉(zhuǎn)發(fā)學(xué)習(xí):* 作用:實(shí)現(xiàn)多個(gè)servlet聯(lián)動(dòng)操作處理請(qǐng)求,這樣避免代碼冗余,讓servlet的職責(zé)更加明確。* 使用:* req.getRequestDispatcher("要轉(zhuǎn)發(fā)的地址").forward(req, resp);* 地址:相對(duì)路徑,直接書寫servlet的別名即可。* 特點(diǎn):* 一次請(qǐng)求,瀏覽器地址欄信息不改變。* 注意:* 請(qǐng)求轉(zhuǎn)發(fā)后直接return結(jié)束即可。*reuqet作用域:* 解決了一次請(qǐng)求內(nèi)的servlet的數(shù)據(jù)共享問題*重定向:* 解決了表單重復(fù)提交的問題,以及當(dāng)前servlet無法處理的請(qǐng)求的問題。* 使用:* resp.sendRedirect(String uri);* 示例:* resp.sendRedirect("/login/main");* 特點(diǎn):* 兩次請(qǐng)求,兩個(gè)request對(duì)象。* 瀏覽器地址欄信息改變* 時(shí)機(jī):* 如果請(qǐng)求中有表單數(shù)據(jù),而數(shù)據(jù)又比較重要,不能重復(fù)提交,建議使用重定向。* 如果請(qǐng)求被Servlet接收后,無法進(jìn)行處理,建議使用重定向定位到可以處理的資源。 *解決主頁面用戶名顯示為null的問題:* 原因:* 因?yàn)樵谟脩舻卿洺晒笫褂弥囟ㄏ蝻@示主頁面,兩次請(qǐng)求,而用戶的信息* 在第一次請(qǐng)求中,第二次請(qǐng)求中沒有用戶數(shù)據(jù),所以顯示為null* 解決:* 使用session*使用ServletContext對(duì)象完成網(wǎng)頁計(jì)數(shù)器* 在用戶登錄校驗(yàn)中創(chuàng)建計(jì)數(shù)器并自增,然后存儲(chǔ)到ServletContext對(duì)象中* 在主頁面里取出計(jì)數(shù)器數(shù)據(jù)顯示給用戶即可。*三天免登陸、訪問次數(shù)統(tǒng)計(jì)、用戶信息顯示 Demo
下面放主要代碼。orm框架部分,見github。
github地址:
https://github.com/HanquanHq/ServletNote01_LoginSystem
項(xiàng)目結(jié)構(gòu):
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"><display-name>04-Login</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><description></description><display-name>CookieServlet</display-name><servlet-name>CookieServlet</servlet-name><servlet-class>cn.hanquan.servlet.CookieServlet</servlet-class></servlet><servlet-mapping><servlet-name>CookieServlet</servlet-name><url-pattern>/CookieServlet</url-pattern></servlet-mapping><servlet><description></description><display-name>MainServlet</display-name><servlet-name>MainServlet</servlet-name><servlet-class>cn.hanquan.servlet.MainServlet</servlet-class></servlet><servlet-mapping><servlet-name>MainServlet</servlet-name><url-pattern>/MainServlet</url-pattern></servlet-mapping><servlet><description></description><display-name>PageServlet</display-name><servlet-name>PageServlet</servlet-name><servlet-class>cn.hanquan.servlet.PageServlet</servlet-class></servlet><servlet-mapping><servlet-name>PageServlet</servlet-name><url-pattern>/PageServlet</url-pattern></servlet-mapping><servlet><description></description><display-name>LoginServlet</display-name><servlet-name>LoginServlet</servlet-name><servlet-class>cn.hanquan.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/LoginServlet</url-pattern></servlet-mapping><servlet><description></description><display-name>NumServlet</display-name><servlet-name>NumServlet</servlet-name><servlet-class>cn.hanquan.servlet.NumServlet</servlet-class><load-on-startup>1</load-on-startup> <!-- tomcat啟動(dòng)立即加載 --></servlet><servlet-mapping><servlet-name>NumServlet</servlet-name><url-pattern>/NumServlet</url-pattern></servlet-mapping><servlet><description></description><display-name>ShowServlet</display-name><servlet-name>ShowServlet</servlet-name><servlet-class>cn.hanquan.servlet.ShowServlet</servlet-class></servlet><servlet-mapping><servlet-name>ShowServlet</servlet-name><url-pattern>/ShowServlet</url-pattern></servlet-mapping></web-app>index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JSP頁面</title> </head> <body><form action='CookieServlet' method='get'><input type='submit' value='跳轉(zhuǎn)到CookieServlet' /><br /></form> </body> </html>CookieServlet.java
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import cn.hanquan.orm.core.Query; import cn.hanquan.orm.core.QueryFactory; import cn.hanquan.orm.po.User;public class CookieServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");Cookie[] cks = req.getCookies();if (cks != null) {// 有cookieString uid = "";for (Cookie c : cks) {if ("uid".equals(c.getName())) {uid = c.getValue();}}if ("".equals(uid)) {// cookie不完整req.setAttribute("str", "You have cleaned cookie, please login again.");req.getRequestDispatcher("/PageServlet").forward(req, resp);return;} else {// 二次驗(yàn)證用戶存在User u = new User();u.setUid(Integer.parseInt(uid));Query q = QueryFactory.createQuery();Object o = q.queryUniqueRow("select * from user where uid=?", User.class, new String[] { uid });if (o != null) {u = (User) o;// 登錄數(shù)據(jù)存入sessionHttpSession hs = req.getSession();hs.setAttribute("user", u);// 計(jì)數(shù)器ServletContext sc = this.getServletContext();if (sc.getAttribute("nums") != null) {int nums = Integer.parseInt((String) sc.getAttribute("nums"));nums += 1;sc.setAttribute("nums", nums + "");} else {sc.setAttribute("nums", "1");}// 重定向resp.sendRedirect("MainServlet");return;} else {resp.sendRedirect("MainServlet");return;}}} else {// 沒有cookieresp.sendRedirect("MainServlet");return;}} }LoginServlet.java
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import cn.hanquan.orm.core.Query; import cn.hanquan.orm.core.QueryFactory; import cn.hanquan.orm.po.User;/*** 接收提交的表單,并根據(jù)登陸結(jié)果重定向* * @author Buuug**/ public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 設(shè)置請(qǐng)求、響應(yīng)編碼格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 獲取表單請(qǐng)求信息String uname = req.getParameter("uname");String upwd = req.getParameter("upwd");System.out.println("獲取到uname=" + uname + "upwd=" + upwd);// 處理請(qǐng)求信息if (uname == null || upwd == null) {// 避免直接訪問此頁報(bào)空指針resp.sendRedirect("PageServlet");return;}User u = new User();u.setUname(uname);u.setUpwd(upwd);Query q = QueryFactory.createQuery();Object result = q.queryUniqueRow("select * from user where uname=? and upwd=?", User.class,new String[] { uname, upwd });System.out.println(result);// 登錄結(jié)果if (result != null) {// rightCookie c = new Cookie("uid", ((User) result).getUid() + "");c.setMaxAge(5 * 60);c.setPath("CookieServlet");resp.addCookie(c);// 登錄數(shù)據(jù)存到sessionHttpSession hs = req.getSession();hs.setAttribute("user", u);// 計(jì)數(shù)器ServletContext sc = this.getServletContext();if (sc.getAttribute("nums") != null) {int nums = Integer.parseInt((String) sc.getAttribute("nums"));nums += 1;sc.setAttribute("nums", nums + "");} else {sc.setAttribute("nums", "1");}// 重定向resp.sendRedirect("MainServlet");return;} else {// wrong// 請(qǐng)求轉(zhuǎn)發(fā)req.setAttribute("str", "用戶名或密碼錯(cuò)誤");req.getRequestDispatcher("PageServlet").forward(req, resp);return;}} }MainServlet.java
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import cn.hanquan.orm.po.User;public class MainServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {// 設(shè)置請(qǐng)求、響應(yīng)編碼格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 獲取Session用戶信息Object o = req.getSession().getAttribute("user");String uname = "";if (o != null) {uname = ((User) o).getUname();} else {resp.sendRedirect("LoginServlet");return;}// 獲取網(wǎng)頁瀏覽次數(shù)int nums = Integer.parseInt((String) this.getServletContext().getAttribute("nums"));// 響應(yīng)處理結(jié)果resp.getWriter().write("<html>");resp.getWriter().write("<head>");resp.getWriter().write("</head>");resp.getWriter().write("<body>");resp.getWriter().write("<h3>歡迎 " + uname + " 訪問尚學(xué)堂管理系統(tǒng)</h3>"); // 只有請(qǐng)求轉(zhuǎn)發(fā)才有效resp.getWriter().write("所有用戶總登錄次數(shù)為:" + nums);resp.getWriter().write("<hr>");resp.getWriter().write("<form action='ShowServlet' method='get'>");resp.getWriter().write("<input type='submit' value='查看個(gè)人信息'>");resp.getWriter().write("</form>");resp.getWriter().write("</body>");resp.getWriter().write("</html>");} }NumServlet.java
package cn.hanquan.servlet;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet;/*** 計(jì)算總登錄次數(shù)* * 在ServletContext和1.txt中,nums以String類型存儲(chǔ)、讀取。* 在讀取至java內(nèi)存之后,轉(zhuǎn)換成int類型進(jìn)行運(yùn)算。* * @author Buuug**/ public class NumServlet extends HttpServlet {@Override/*** 讀文件*/public void init() throws ServletException {String path = this.getServletContext().getRealPath("/nums/1.txt");FileReader fr = null;BufferedReader br = null;System.out.println("讀 :" + path);try {fr = new FileReader(path);br = new BufferedReader(fr);String nums = br.readLine();// 寫入ServletContextthis.getServletContext().setAttribute("nums", nums);} catch (Exception e) {e.printStackTrace();} finally {try {fr.close();} catch (IOException e) {e.printStackTrace();}try {br.close();} catch (IOException e) {e.printStackTrace();}}}@Override/*** 寫文件*/public void destroy() {// 寫入txtint nums = Integer.parseInt((String) this.getServletContext().getAttribute("nums"));String path = this.getServletContext().getRealPath("/nums/1.txt");System.out.println("寫:" + path);BufferedWriter bw = null;FileWriter fw = null;try {fw = new FileWriter(path);bw = new BufferedWriter(fw);bw.write(nums + "");bw.flush();} catch (Exception e) {e.printStackTrace();} finally {try {fw.close();} catch (IOException e) {e.printStackTrace();}try {bw.close();} catch (IOException e) {e.printStackTrace();}}}}PageServlet.java
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** 繪制登錄頁面、提交表單* * @author Buuug**/ public class PageServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");String str = (String) req.getAttribute("str") == null ? "" : (String) req.getAttribute("str");// 錯(cuò)誤提示resp.getWriter().write("<html>");resp.getWriter().write("<head>");resp.getWriter().write("</head>");resp.getWriter().write("<body>");resp.getWriter().write("<font color='red' size='20px'>" + str + "</font>");resp.getWriter().write("<form action='LoginServlet' method='get'>");resp.getWriter().write("用戶名:<input type='text' name='uname' value=''/><br/>");resp.getWriter().write("密碼:<input type='password' name='upwd' value=''/><br/>");resp.getWriter().write("<input type='submit' value='登錄'/><br/>");resp.getWriter().write("</form>");resp.getWriter().write("</body>");resp.getWriter().write("</html>");} }ShowServlet.java
package cn.hanquan.servlet;import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import cn.hanquan.orm.po.User;/*** 在MainServlet中,顯示用戶個(gè)人信息* * @author Buuug**/ public class ShowServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");HttpSession hs = req.getSession();if (hs.getAttribute("user") == null) {resp.sendRedirect("/CookieServlet");return;}User u = (User) hs.getAttribute("user");// 表格顯示個(gè)人信息resp.getWriter().write("<html>");resp.getWriter().write("<head>");resp.getWriter().write("</head>");resp.getWriter().write("<body>");resp.getWriter().write("<table border='1px'>");resp.getWriter().write("<tr>");resp.getWriter().write("<td>用戶名</td>");resp.getWriter().write("<td>" + u.getUname() + "</td>");resp.getWriter().write("</tr>");resp.getWriter().write("<tr>");resp.getWriter().write("<td>密碼</td>");resp.getWriter().write("<td>" + u.getUpwd() + "</td>");resp.getWriter().write("</tr>");resp.getWriter().write("</table>");resp.getWriter().write("</body>");resp.getWriter().write("</html>");} }總結(jié)
以上是生活随笔為你收集整理的【Servlet】ServletContext、ServletConfig对象学习、用户登录系统完善的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Servlet】Session的特点和
- 下一篇: 【计算机系统结构】第一周 课上笔记