实验1servlet实验.doc
沈阳理工大学应用技术学院JavaWeb程序设计实验实验题目: Servlet编程设计 院 系: 信息与控制学院 专 业: 计算机科学与技术 班级学号: 11301234 学生姓名: 张森 指导教师: 靳新 成 绩: 2013 年 4 月 20 日实验一 Servlet编程设计【开发语言及实现平台或实验环境】Windows系统,JDK,myEclipse开发环境,Tomcat服务器 【实验目的】1、熟悉Servlet的基本概念2、掌握Servlet的工作原理3、掌握servlet的生命周期4、掌握Servlet处理表单数据的编程方式5、掌握Servlet会话管理的编程设计【实验内容】1、编写一个Servlet处理表单的程序,基本要求:(1)客户端以HTML表单方式向服务器提交数据的方法;(2)提交方法采用Post方法;(3)表单中涉及到各种常用控件;(4)使用相应方法获取表单数据2、程序实现功能如图所示:注意:项目名为LoginServletProject,表单文件名为Login.html,获取表单的Servlet名为LoginServlet。 Login.html LoginServlet.java3、程序功能提升要求:(1)在表单的“建议”中使用FCKeditor实现编辑器功能;(2)如果输入无效参数,使用JSValidation验证框架对表单中每个选项的内容进行有效性验证。如图: 【代码实现】1、Login.html<!DOCTYPE HTML PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN"><html><head><title>Login.html</title><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="this is my page"><meta http-equiv="content-type" content="text/html; charset=UTF-8"><!- 引入fckeditor 框架 -><script type="text/javascript"src="/LoginServletProject/fckeditor/fckeditor.js"></script><!- 引入js-Validation验证框架 -><script language="javascript"src="/LoginServletProject/js/validation-framework.js"></script><!- 用于替换文本域引入fckeditor的脚本 -><!- <script type="text/javascript">window.onload = function() var oFCKeditor = new FCKeditor('advise');oFCKeditor.BasePath = '/LoginServletProject/fckeditor/'oFCKeditor.ReplaceTextarea();</script> -></head><body><h2>潜在用户调查</h2><br><br><form action="getmessage" id="form1" method="post"onsubmit="return doValidate(this)">姓名: <input type="text" name="username" /><br ><br>EMAIL: <input type="text" name="email" /><br><br>年纪:<input type="radio" name="age" value="小于18" checked>小于18<input type="radio" name="age" value="18-25">18-25<input type="radio" name="age" value="26-40">26-40<input type="radio" name="age" value="大于40">大于40<br><br />编程时间:<select name="time"><option value="1年内">1年内</option><option value="1-2年内">1-2年</option><option value="3年以上">3年以上</option></select><br><br>所使用的操作系统:<select name="os" multiple size=6><option value="win xp">win xp</option><option value="win 2000/2003">win 2000/2003</option><option value="linux">linux</option><option value="freeBSD">freeBSD</option><option value="mac os">mac os</option><option value="other">other</option></select><br><br>使用的编程语言:<input type="checkbox" name="language" value="C">C<input type="checkbox" name="language" value="C+">C+<input type="checkbox" name="language" value="C#">C#<input type="checkbox" name="language" value="PYTHON">PYTHON<input type="checkbox" name="language" value="JAVA">JAVA<input type="checkbox" name="language" value="VB">VB<input type="checkbox" name="language" value="DEPHI">DEPHI<br><br>建议: <!- 用下面的javascript代码代替文本域 advise表示文本域的name值 -> <script type="text/javascript"> var oFCKeditor = new FCKeditor('advise'); oFCKeditor.BasePath = '/LoginServletProject/fckeditor/' oFCKeditor.Height = 200; oFCKeditor.Width = 700; oFCKeditor.ToolbarSet = 'Default' oFCKeditor.Create(); </script><br><br><input type="submit" value="提交"><input type="reset" value="重置"></form></body></html> 2、LoginServlet.java 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;public class LoginServlet extends HttpServlet public LoginServlet() super();public void destroy() super.destroy(); public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException doPost(request, response);public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();request.setCharacterEncoding("utf-8");String username = request.getParameter("username");String email = request.getParameter("email");String age = request.getParameter("age");String time = request.getParameter("time");String os = request.getParameterValues("os");String language = request.getParameterValues("language");String advise = request.getParameter("advise");out.print("姓名:"+username);out.print("<br>");out.print("email: "+email);out.print("<br>");out.print("年龄:"+age);out.print("<br>");out.print("编程时间:"+time);out.print("<br>");out.print("使用的操作系统:");for(int i = 0;i<os.length;i+)out.print(osi+" ");out.print("<br>");out.print("使用的编程语言:");for(int s = 0;s<language.length;s+)out.print(languages+" ");out.print("<br>");out.println("建议:"+advise);out.flush();out.close();public void init() throws ServletException 【思考题】1、如何修改Tomcat端口号?在tomcat文件conf文件夹下的server.xml文件,更改port端口号,默认为8080端口。 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />2、说明在Tomcat中,tomcat-user.xml文件的作用。 用于配置Tomcat使用的用户名,密码等信息3、如何在web.xml中配置一个编写好的Servlet?需要指定: <servlet> <servlet-name>配对名</servlet-name> <servlet-class>servlet类名</servlet-class> </servlet> <servlet-mapping> <servlet-name>配对名</servlet-name> <url-pattern>/请求的url</url-pattern> </servlet-mapping>4、说明Servlet类的结构。GET请求就是用户在浏览器的地址栏里输入一个地址、在网页上点击连接或产生一个没有定义方法的HTML表单后产生的请求。Servlets还能轻松处理表单的提交(POST),关于处理表单提交我们将在后面几部分谈到。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SomeServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException / 用 "request" 读取http信息头(如cookie) / 和HTML表单数据 (如用户输入和提交的数据) / 用"response"指定http响应 和http信息头 / (如指明信息的类型、设定cookie). PrintWriter out = response.getWriter(); / 用 "out"输出内容到浏览器 不管是用doGet还是doPost方法,servlet都要用到HttpServlet扩展类。这些方法可分为两类:HttpServletRequest和HttpServletResponse。HttpServletRequest含有获得表单数据、HTTP信息头等信息的方法。 HttpServletResponse则包含指明HTTP响应 (200, 404,等。)、信息头(Content-Type, Set-Cookie, 等。)的方法,更重要的是你能使用PrintWriter方法向客户端输出信息。注意doGet和doPost方法会抛出两个异常,所以必须在定义里包含他们。要用到PrintWriter、HttpServlet和HttpServletRequest, HttpServletResponse方法还必须分别引入java.io、javax.servlet和javax.servlet.http。 一般来说,doGet和doPost是被service方法调用的,但有时候你可能想越过service方法而直接使用自己定义的service方法,比如定义一个既能处理GET也能处理POST请求的servlet。 5、说明Servlet的生命周期。Servlet的生命周期是由servlet的容器来控制的。分为3个阶段:初始化阶段(init)、运行阶段(run)、销毁阶段(destroy)。一、 init初始化阶段步骤:1) Servlet容器加载servlet类,把它的. Class文件中的数据读到内存中。2) Servlet容器创建servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。此外servlet容器还会使得servletConfig对象与当前的web应用的servletContext对象关联。3) Servlet容器创建servlet对象。4) Servlet容器调用servlet对象的init(ServletConfig config)方法。通过初始化步骤,创建了servlet对象和servletConfig对象,并且servlet对象与servletConfig对象关联,而servletConfig对象又与当前对象的servletContext对象关联。当servlet容器完成servlet后,servlet对象只要通过getServletContext()方法就能得到web应用的servletContext对象。初始化的情况:1) 当web应用处于运行阶段时,特定的servlet被客户端首次请求访问。2) 在web.xml文件中为servlet设置了<load-on-startup>元素<servlet><servlet-name>servlet1</servlet-name><servlet-class>servlet.servlet1</servlet-class><load-on-startup>0</load-on-startup></servlet>3) 当web应用被重新启动时,web应用中的所有servlet会在特定的时间被重新初始化。二、 run1) 在这个阶段sevlet可以随时响应客户端的请求。当servlet容器接到访问特定的servlet请求时,servlet容器会创建针对与这个请求的servletRequest和servletResponse对象,然后调用service()方法,并把这两个对象当做参数传递给service()方法。Service()方法通过servletRequest对象获得请求信息,并处理该请求,再通过servletResponse对象生成响应结果。2) 【不管是post还是get方法提交,都会在service中处理,然后,由service来交由相应的doPost或doGet方法处理,如果你重写了service方法,就不会再处理doPost或doGet了,如果重写sevice()方法,可以自己转向doPost()或doGet()方法】 注:当servlet容器把servlet生成的响应结果发送给客户后,servlet容器会销毁servletRequest和sevletResponse对象。三、 destory 当Web应用被终止时,servlet容器会先调用web应用中所有的servlet对象的destroy()方法,然后在销毁servlet对象。此外容器还会销毁与servlet对象关联的servletConfig对象。 在destroy()方法的实现中,可以释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。6、说明在Servlet中如何处理接受参数的乱码问题。servlet中时常要接收jsp页面传过来的参数,它也要进行一次编码转换,转换方式是,在接收参数的方法内,接收参数之前加上:request.setCharacterEncoding("gb2312");这句话,是专门处理页面传过来的乱码处理问题,保证在这里接收时,能接收到正确的中文。而还有一名话,也是要加的:response.setContentType("text/html; charset=gb2312");这句话,就是专门处理在servlet里,当参数经过处理后,要传到客户端显示时,要保证传送的是正确的中文。这两句话,都得写在servlet里。7、如何在Servlet中使用Cookie对象用到的类 javax.servlet.http.Cookie构造cookie 的方法 : new Cookie(键,值)构造函数如下:Cookie(java.lang.String name, java.lang.String value)把cookie发送给客户端HttpServletResponse.addCookie(javax.servlet.http.Cookie)取得客户浏览器的cookie,返回的是数组HttpServletRequest.getCookies()getComment/setComment 获取/设置Cookie的注释。getDomain/setDomain获取/设置Cookie适用的域。一般地,Cookie只返回给与发送它的服务器名字完全相同的服务器。使用这里的方法可以指示浏览器把Cookie返回给同一域内的其他服务器。注意域必须以点开始(例如),非国家类的域(如.com,.edu,.gov)必须包含两个点,国家类的域(如,.edu.uk)必须包含三个点。getMaxAge/setMaxAge获取/设置Cookie过期之前的时间,以秒计。如果不设置该值,则Cookie只在当前会话内有效,即在用户关闭浏览器之前有效,而且这些Cookie不会保存到磁盘上。若生存时间为负值,代表浏览器关闭Cookie即消失。生存时间为0,代表删除Cookie,生存时间为正数,代表Cookie存在多少秒。getName/setName获取/设置Cookie的名字。本质上,名字和值是我们始终关心的两个部分。由于HttpServletRequest的getCookies方法返回的是一个Cookie对象的数组,因此通常要用循环来访问这个数组查找特定名字,然后用getValue检查它的值。getPath/setPath获取/设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下的所有页面。这里的方法可以用来设定一些更一般的条件。例如,someCookie.setPath("/"),此时服务器上的所有页面都可以接收到该Cookie。getSecure/setSecure获取/设置一个boolean值,该值表示是否Cookie只能通过加密的连接(即SSL)发送。getValue/setValue获取/设置Cookie的值。如前所述,名字和值实际上是我们始终关心的两个方面。不过也有一些例外情况,比如把名字作为逻辑标记(也就是说,如果名字存在,则表示true)。8、如何设定Cookie对象的有效期。 Cookie cookie=new Cookie(cookieName, "Test_Content"); cookie.setMaxAge(10); /存活期为10秒