03_Servlet编程

来源:互联网 发布:java主要用途 编辑:程序博客网 时间:2024/05/01 22:53

3.1 Servlet基础知识

Servlet是运行在Web服务器上的一种特殊的Java程序,它和其他的Java程序一样编写、编译,它的特点在于Servlet必须继承Servlet类或它的子类。


3.2 编写第一个简单的Servlet程序

示例3-1:第一个Servlet程序

源文件:HelloWorld.java

package uikoo9.servlet.demo;import java.io.*;import java.util.Date;import javax.servlet.*;import javax.servlet.http.*;//访问:http://localhost:8080/oo/HelloWorld@SuppressWarnings("serial")public class D01_HelloWorld extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter();out.println("Hello World!");out.println(new Date());out.flush();out.close();}}

这个程序引入了java.servlet和java.servlet.http两个包,这两个包不是JavaSE的内容而是JavaEE的内容。

3.2.1 配置servlet invoker

配置invoker之后每次新增Servlet之后不用去配置Servlet映射就可以直接访问了。

配置方法:tomcat/conf/web.xml中添加两段代码:

<servlet>        <servlet-name>invoker</servlet-name>        <servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>        <init-param>            <param-name>debug</param-name>            <param-value>0</param-value>        </init-param>        <load-on-startup>2</load-on-startup>    </servlet>
<servlet-mapping>        <servlet-name>invoker</servlet-name>        <url-pattern>/servlet/*</url-pattern></servlet-mapping>
之后就可以在地址栏访问如下地址了:

http://localhost:8080/JavaWebRuMen/servlet/uikoo9.servlet.demo.HelloWorld

但对于Tomcat 6.X 而言,会出现下面错误:
java.lang.SecurityException: Servlet of class org.apache.catalina.servlets.InvokerServlet is privileged and cannot be loaded by this web application

解决方法: 
修改conf/context.xml文件,新加两个属性 .
<Context  reloadable="true" privileged="true" >
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

3.2.2 配置Servlet映射

对每一个Servlet配置映射可以避免暴露实际路径

在对应项目的WEB-INF下的web.xml加上一下两段即可:

<servlet>    <servlet-name>D01_HelloWorld</servlet-name>    <servlet-class>uikoo9.servlet.demo.D01_HelloWorld</servlet-class></servlet><servlet-mapping>    <servlet-name>D01_HelloWorld</servlet-name>    <url-pattern>/servlet/HelloWorld</url-pattern></servlet-mapping>

其中的<servlet-name>将<servlet-class>和<url-pattern>连接了起来

当tomcat 接受到/HelloWorld的访问时会查找web.xml找到<servlet-name>之后再找到对应的<servlet-class>

3.2.3 Servlet的运行机制


3.3 HttpServlet中的方法

3.3.1 doGet()/doPost()方法

3.3.2 init()方法

3.3.3 service()方法

service()方法会根据请求的类型决定调用doGet()还是doPost()方法

3.3.4 destroy()方法


3.4 Servlet的生命周期


3.5 利用Servlet读取HTML表单数据

3.5.1 客户端传递数据的方式

3.5.2 在Servlet中读取客户端发送的数据

示例3-2:网页表单HTML文件

源文件:PersonData.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>用户登录</title>  </head>    <body>    <center>    <form action="servlet/GetPersonData" name="login" method="post">    姓名:<input type="text" name="PersonName" /><br />    密码:<input type="password" name="PersonPwd" /><br />    <input type="submit" value="提交" />    </form>    </center>  </body></html>

示例3-3:获得表单数据

源文件:GetPersonData.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/PersonData.html@SuppressWarnings("serial")public class D02_GetPersonData extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String personName = request.getParameter("PersonName");String personPwd = request.getParameter("PersonPwd");PrintWriter out = response.getWriter();out.println("姓名:" + personName);out.println("<br />");out.println("密码:" + personPwd);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-4:具有多选列表的表单

源文件:PersonData1.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>用户登录</title>  </head>    <body>    <center>    <form action="servlet/GetPersonData1" name="login" method="post">    姓名:<input type="text" name="PersonName" /><br />    密码:<input type="password" name="PersonPwd" /><br />    兴趣:    <select name="Favor" multiple size=4>    <option value="Basketball">Basketball</option>    <option value="Vollyball">Vollyball</option>    <option value="Reading">Reading</option>    <option value="Music">Music</option>    </select>    <input type="submit" value="提交" />    </form>    </center>  </body></html>

示例3-5:使用getParameterValues获得多个值

源文件:GetPersonData1.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/PersonData1.html@SuppressWarnings("serial")public class D03_GetPersonData1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String personName = request.getParameter("PersonName");String personPwd = request.getParameter("PersonPwd");String[] favor = request.getParameterValues("Favor");PrintWriter out = response.getWriter();out.println("姓名:" + personName);out.println("<br />");out.println("密码:" + personPwd);out.println("<br />");out.println("Favor:<br />");for (int i = 0; i < favor.length; i++) {out.println("  " + favor[i]);out.println("<br />");}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}


3.6 处理HTTP报头

通过Servlet我们可以获得HTTP请求报头信息,或者设置响应报头信息

3.6.1 在Servlet中取得HTTP请求报头

示例3-6:获得HTTP请求头信息

源文件:GetRequestHeader.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/GetRequestHeader@SuppressWarnings("serial")public class D04_GetRequestHeader extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Enumeration headers = request.getHeaderNames();String header = null;PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 TRANSITIONAL//EN\">");out.println("<html>");out.println("  <head><title>http request header</title></head>");out.println("  <body>");out.print("<center>");out.print("<table border=1>\n");out.print("<tr>");out.print("<td>");out.print("Http Header Name");out.print("</td>");out.print("<td>");out.print("Http Header Value");out.print("</td>");out.print("</tr>");while(headers.hasMoreElements()){header = (String)headers.nextElement();out.print("<tr>");out.print("<td>");out.print("" + header);out.print("</td>");out.print("<td>");out.print("" + request.getHeader(header));out.print("</td>");out.print("</tr>");}out.println("  </table>\n");out.println("  </center>");out.println("  </body>\n");out.println("</html>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

3.6.2 读取CGI变量

示例3-7:在Servlet中获得CGI变量

源文件:GetCGIVar.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/GetCGIVar@SuppressWarnings("serial")public class D05_GetCGIVar extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String cgiVars[][] = {{"AUTH_TYPE",request.getAuthType()},{"CONTENT_LENGTH",String.valueOf(request.getContentLength())},{"DOCUMENT_ROOT",getServletContext().getRealPath("/")},{"CONTENT_TYPE",request.getContentType()},{"REMOTE_ADDR",request.getRemoteAddr()},{"REMOTE_HOST",request.getRemoteHost()},{"REMOTE_USER",request.getRemoteUser()},{"REQUEST_METHOD",request.getMethod()},{"PATH_INFO",request.getPathInfo()},{"PATH_TRANSLATED",request.getPathTranslated()},{"QUERY_STRING",request.getQueryString()},{"REQUEST_URI",request.getRequestURI()},{"SCRIPT_NAME",request.getServletPath()},{"SERVER_NAME",request.getServerName()},{"SERVER_PORT",String.valueOf(request.getServerPort())},{"SERVER_PROTOCOL",request.getProtocol()},{"SERVER_SOFTWARE",getServletContext().getServerInfo()},};PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("  <HEAD><TITLE>CGI Vars</TITLE></HEAD>");out.println("  <body>");out.print("<center>");out.print("<table border=1>\n");out.print("<tr>");out.print("<td>");out.print("CGI Var Name");out.print("</td>");out.print("<td>");out.print("Value");out.print("</td>");out.print("</tr>");for (int i = 0; i < cgiVars.length; i++) {out.print("<tr>");out.print("<td>");out.print("" + cgiVars[i][0]);out.print("</td>");out.print("<td>");out.print("" + cgiVars[i][1]);out.print("</td>");out.print("</tr>");}out.println("  </table>\n");out.println("  </center>");out.println("  </body>\n");out.println("</html>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

3.6.3 在Servlet中设置HTTP响应头

示例3-8:在Servlet中产生图片

源文件:Img.java

package uikoo9.servlet.demo;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/Img@SuppressWarnings("serial")public class D06_Img extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//设置Content-Type响应头response.setContentType("image/jpeg");//设置页面不缓存response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();Random random = new Random();g.fillRect(0, 0, 80, 20);g.setFont(new Font("Times New Roman",Font.ITALIC,18));String sRand = "";String rand = null;for (int i = 0; i < 4; i++) {rand = String.valueOf(random.nextInt(10));sRand += rand;g.setColor(new Color(20 + random.nextInt(110),20 + random.nextInt(110),20 + random.nextInt(110)));g.drawString(rand, 20*i + 6, 16);}g.dispose();ImageIO.write(image, "JPEG", response.getOutputStream());}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-9:将产生的图片用到登录表单中

源文件:Login.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>登录</title>  </head>    <body>    <center>    <form action="loginServlet" method="post">    姓名:<input type="text" name="userName" /><br />    密码:<input type="password" name="userPwd" /><br />    验证码:<input type="text" name="valCode" size=10 />    <img alt="验证码" src="Img"><br />    <input type="submit" value="提交" />    </form>    </center>  </body></html>

示例3-10:使用sendRedirect跳转

源文件:Redirect.java

package uikoo9.servlet.demo;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/Redirect?dir=hello@SuppressWarnings("serial")public class D07_Redirect extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {if(request.getParameter("dir").equals("login"))response.sendRedirect("Login.html");elseresponse.sendRedirect("Img");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

使用sendRedirect()是跳转不传值url改变,使用RequestDispatcher的forward是跳转传值url不变

示例3-11:使用RequestDispatcher的forward方法转向到其他页面

源文件:Forward.java

package uikoo9.servlet.demo;import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/Forward?dir=login@SuppressWarnings("serial")public class D08_Forward extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {RequestDispatcher rd;if(request.getParameter("dir").equals("login")){rd = request.getRequestDispatcher("Login.html");rd.forward(request, response);}else{rd = request.getRequestDispatcher("GetForward");rd.forward(request, response);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-12:获得跳转时候的request中传递的数据

源文件:GetForward.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/Forward?dir=HelloWorld@SuppressWarnings("serial")public class D09_GetForward extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter();out.println(request.getParameter("dir"));out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

3.6.4 通过HTTP报头解决中文问题

示例3-13:设置中文编码的报头

源文件:ChineseHello.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/ChineseHello@SuppressWarnings("serial")public class D10_ChineseHello extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//若不加下面这一句则会显示???response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("你好!");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-14:接收数据的表单

源文件:ChineseForm.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>ChineseForm</title>  </head>    <body>    <center>    <form action="ChineseHello1" method="post">    <input type="text" name="cn" />    <input type="submit" value="提交" />    </form>    </center>  </body></html>

示例3-15:在Servlet中处理表单中的中文数据

源文件:ChineseHello1.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/ChineseForm.html@SuppressWarnings("serial")public class D11_ChineseHello1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//不加这句,则不能得到传输过来的中文request.setCharacterEncoding("GBK");response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("你好!");out.println(request.getParameter("cn"));out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}


3.7 处理Cookie

3.7.1 Cookie基础

Cookie是一小段的文本,通过CGI/ASP/JSP/Servlet等程序,可以将Cookie保存在浏览器所在的客户端的内存或磁盘上。

通常不要将你的程序设计成对Cookie有很大的依赖性,因为一旦用户关闭了浏览器的Cookie功能,有可能造成你的程序无法正确运行。

3.7.2 在Servlet中处理Cookie

示例3-16:处理Cookie

源文件:LoginServlet.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/LoginServlet@SuppressWarnings("serial")public class D12_LoginServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String cookieName = "userName";String cookiePwd = "pwd";Cookie[] cookies = request.getCookies();String userName = "";String pwd = "";String isChecked = "";if (cookies != null) {isChecked = "checked";for (int i = 0; i < cookies.length; i++) {if (cookies[i].getName().equals(cookieName)) {userName = cookies[i].getValue();}if (cookies[i].getName().equals(cookiePwd)) {pwd = cookies[i].getValue();}}}response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<html>");out.println("  <head><title>登录</title></head>");out.println("  <body>");out.println("  <center>");out.println("  <form action=\"CookieTest\" method=\"post\">");out.println("  姓名:<input type=\"text\" name=\"userName\" value=\""+userName+"\" /><br />");out.println("  密码:<input type=\"password\" name=\"Pwd\" value=\""+pwd+"\" /><br />");out.println("  保存用户名和密码:<input type=\"checkbox\" name=\"SaveCookie\" value=\"Yes\""+ isChecked + " /><br />");out.println("  <input type=\"submit\" value=\"提交\">");out.println("  </form>");out.println("  </center>");out.println("  </body>");out.println("</html>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-17:设置Cookie

源文件:CookieTest.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@SuppressWarnings("serial")public class D13_CookieTest extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Cookie userCookie = new Cookie("userName",request.getParameter("userName"));Cookie pwdCookie = new Cookie("pwd",request.getParameter("pwd"));if(request.getParameter("SaveCookie")!=null && request.getParameter("SaveCookie").equals("Yes")){userCookie.setMaxAge(7*24*60*60);pwdCookie.setMaxAge(7*24*60*60);}else{userCookie.setMaxAge(0);pwdCookie.setMaxAge(0);}response.addCookie(userCookie);response.addCookie(pwdCookie);request.setCharacterEncoding("GBK");response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("Welcome," + request.getParameter("userName"));out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

3.8 会话跟踪

3.8.1 会话的意义和用途

session是一种基于cookie的技术,当浏览器关闭cookie功能时,可以使用URL重写的方法,也就是在URL后加上session的id号

3.8.2 Servlet 中跟踪会话状态

示例3-18:保存信息到session中

源文件:SaveInfo.java

out.flush();        out.close();package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;//访问:http://localhost:8080/oo/SaveInfo?userName=qiao@SuppressWarnings("serial")public class D14_SaveInfo extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {if(request.getParameter("userName") != null){HttpSession session = request.getSession();session.setAttribute("userName", request.getParameter("userName"));}response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("session已创建");out.println("<br />");out.println("转到其他页面<a href=\"GetSession\">页面</a>");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-19:从Session中读取数据

源文件:GetSession.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;//访问:http://localhost:8080/oo/SaveInfo?userName=qiao后点击连接@SuppressWarnings("serial")public class D15_GetSession extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();String userName = "";HttpSession session = request.getSession(false);if(session != null){userName = (String)session.getAttribute("userName");out.println("获得创建的session");out.println("<br />");out.println("登录名为:" + userName);}else{response.sendRedirect("SessionLogin.html");}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

3.9 ServletContext接口

示例3-20:将数据保存到ServletContext中

源文件:FirstServlet.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/FirstServlet@SuppressWarnings("serial")public class D16_FirstServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ServletContext ctx = this.getServletContext();synchronized (this) {Integer counter = (Integer)ctx.getAttribute("userNumber");int tmp = 0;if(counter == null){counter = new Integer(1);}else{tmp = counter.intValue() + 1;counter = new Integer(tmp);}ctx.setAttribute("userNumber", counter);}response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("<html>");out.println("<head><title>首页</title></head>");out.println("<body>");out.println("这是第一页!");out.println("</body>");out.println("</html>");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-21:从ServletContext中读取计数器

源文件:UserNumber.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/UserNumber@SuppressWarnings("serial")public class D17_UserNumber extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ServletContext ctx = this.getServletContext();Integer counter = (Integer)ctx.getAttribute("userNumber");response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("<html>");out.println("<head><title>访问人数统计</title></head>");out.println("<body>");if(counter != null){out.println("已经有" + counter.intValue() + "人访问本网站!");}else{out.println("你是第一个访问本网站的!");}out.println("</body>");out.println("</html>");}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-22:读取web.xml中设置的参数

源文件:InitParamsServlet.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 本例为web.xml已经有如下内容,在servlet中读取相应的内容并显示 * <context-param> * <param-name>serverName</param-name> * <param-value>localhost</param-value> * </context-param> * <context-param> * <param-name>userName</param-name> * <param-value>system</param-value> * </context-param> * <context-param> * <param-name>password</param-name> * <param-value>manager</param-value> * </context-param> *///访问:http://localhost:8080/oo/InitParamsServlet@SuppressWarnings("serial")public class D18_InitParamsServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {ServletContext ctx = this.getServletContext();String serverName = ctx.getInitParameter("serverName");String userName = ctx.getInitParameter("userName");String password = ctx.getInitParameter("password");response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("<html>");out.println("<head><title>读取初始化参数</title></head>");out.println("<body>");out.println("服务器:" + serverName + "<br />");out.println("用户名:" + userName + "<br />");out.println("密码:" + password + "<br />");out.println("</body>");out.println("</html>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

3.10编写线程安全的Servlet

3.10.1 编写线程安全的Servlet

示例3-23:多线程并发的Servlet程序

源文件:MultiThreadServlet.java

package uikoo9.servlet.demo;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//访问:http://localhost:8080/oo/MultiThread.htm@SuppressWarnings("serial")public class D19_MultiThreadServlet extends HttpServlet {//全局变量private int instanceVar = 0;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=GBK");PrintWriter out = response.getWriter();out.println("<html>");out.println("<body>");try {for(int i=0; i<10; i++){out.println(instanceVar);out.println("<br />");Thread.sleep(1000);instanceVar++;}} catch (Exception e) {out.println("error");}out.println("</body>");out.println("</html>");out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doGet(request, response);}}

示例3-24:模拟并发访问的HTML文件

源文件:MultiThread.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><frameset rows="10%,10%,10%,10%,10%,10%,10%,10%"><frame src="index.jsp" /><frame src="MultiThreadServlet" /><frame src="index.jsp" /><frame src="MultiThreadServlet" /><frame src="index.jsp" /><frame src="MultiThreadServlet" /><frame src="index.jsp" /><frame src="MultiThreadServlet" /></frameset></html>

可以将try块包含在同步块中(synchronized)

3.10.2 Servlet2.4中被废弃的SingleThreadModel接口

原创粉丝点击