一、首先用Myeclipse2015创建一个web项目,然后修改index.jsp.

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 3 <html>
 4   <head>
 5     <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
 6     <title>我的JSP开始页面</title>
 7     <meta http-equiv="pragma" content="no-cache">
 8     <meta http-equiv="cache-control" content="no-cache">
 9     <meta http-equiv="expires" content="0">    
10     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
11     <meta http-equiv="description" content="This is my page">
12   </head>
13   
14   <body>
15   <form action="reg" method="get">
16       <table border="0">
17           <tr><td colspan="2">添加用户信息</td></tr>
18           <tr><td>姓名:</td><td><input type="text" name="name" value="张道陵"></td></tr>
19           <tr><td>性别:</td><td><input type="text" name="sex" value="男"></td></tr>
20           <tr><td>年龄:</td><td><input type="text" name="age" value="99"></td></tr>
21           <tr><td>信息:</td><td><input type="text" name="info" value="五斗米道教主"></td></tr>
22           <tr><td colspan="2"><input type="submit" value="确认"></td></tr>
23       </table>
24   </form><br>
25   </body>
26 </html>
View Code


主要关注表单。其中有默认的value,是为了测试方便。

二、创建Servlet文件reg.java,覆写其中的doGet和doPost方法。

 1 package com.kaly.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class reg extends HttpServlet {
12     private static final long serialVersionUID = 1L;
13        
14     //无参构造函数
15     public reg() {
16         super();
17     }
18 
19     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
20         //这两句解决中文乱码的问题,在用PrintWriter输出是正常的,请求转发的时候不正常。与Filter冲突,所以不能有过滤器。
21         request.setCharacterEncoding("utf-8");
22         response.setContentType("text/html);charset=utf-8");
23         String usernameString=request.getParameter("name");
24         String sexString=request.getParameter("sex");
25         String ageString=request.getParameter("age");
26         String infoString=request.getParameter("info");
27         PrintWriter out=response.getWriter();
28         out.print("<html><head><title>调用servlet</title></head><body>");
29         out.print(usernameString+","+sexString+","+ageString+","+infoString+".");
30         out.print("</body></html>");
31         out.flush();
32         out.close();
33         
34         //下面这些信息,通过请求转发传递之后中文显示乱码。设置过字符集和过滤器都不起作用。
35 //        request.setAttribute("username", usernameString);
36 //        request.setAttribute("sex", sexString);
37 //        request.setAttribute("age", ageString);
38 //        request.setAttribute("info", infoString);
39         //如果上面往输出流写了东西,这里请求转发就会出现异常
40 //        request.getRequestDispatcher("/index.jsp").forward(request, response);
41     }
42 
43     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
44         doGet(request, response);//在doGet和doPost任何一个方法中加上对另一个方法的调用,就可以具备处理两种提交方法的功能
45     }
46 }
View Code

其中被注释掉的是调试失败的代码,主要问题是没有处理好中文乱码的问题。而且,如果已经使用了PrintWriter对象向输出流写入了内容,在使用注释掉的那部分代码实现请求转发就会出现“java.lang.IllegalStateException: Cannot forward after response has been committed”的异常。

三、在web.xml中注册servlet,如果是用新建servlet建立的servlet,则Myeclipse会自动建立好相关的注册和映射信息。如果是自定义了一个继承了Servlet的类,则需要手动添加相关信息。

添加下面代码段,其中<servlet-name>节点指定servlet类的引用名称,这个名称将在前端表单action中使用,<servlet-class>节点指定servlet完整的类名。

1 <servlet>
2         <servlet-name>reg</servlet-name>
3         <display-name>reg</display-name>
4         <description></description>
5         <servlet-class>com.kaly.servlet.reg</servlet-class>
6 </servlet>

添加下面代码段,其中<servlet-name>节点是servlet类的引用名称,必须和上面的<servlet-name>节点的值保持一致,<url-pattern>节点指定servlet映射的相对路径,一般在前面都有个"/"。

1 <servlet-mapping>
2         <servlet-name>reg</servlet-name>
3         <url-pattern>/reg</url-pattern>
4 </servlet-mapping>

运行结果如下:

点击"确认"按钮之后。

还没有解决请求转发过程中中文乱码的问题。