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>
对每一个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接口
- 03_Servlet编程
- java编程_servlet
- java编程_servlet(续)
- 03_Servlet 环境设置
- 03_servlet生命周期
- 第一章_servlet
- Servlet学习笔记_Servlet
- 黑马程序员_Servlet
- web.xml(5)_servlet
- 黑马程序员_Servlet生命周期
- 01_Servlet 教程
- 02_Servlet 简介
- 04_Servlet 生命周期
- 05_Servlet 实例
- 06_Servlet 表单数据
- 10_Servlet 编写过滤器
- 11_Servlet 异常处理
- 12_Servlet Cookies 处理
- Class.forName和ClassLoader.loadClass的不同
- spring MVC 参数映射JSP页面
- jos
- JDK1.7,apache ant1.8.4,activiti5.10
- C++ 调用mysql的存储过程 出现1312错误
- 03_Servlet编程
- java中的io流
- android中点击空白处隐藏软键盘
- Java学习笔记(十三)
- 设计模式--观察者模式
- java设计模式之装饰模式(在i/o流中的应用)
- Java学习笔记(十四)
- ZOJ 1084 Channel Allocation 四色定理
- MySQL错误代码大全