引言:突然回忆起一年前的面试,要我用servlet写一个登录窗口,成功就跳转,失败就重新登录。开始觉得很简单,这不小意思嘛!谁知道上机一试,彻底掉链子了,最后理所当然的被狠狠的鄙视了一番。至今想起,心寒不已。于是趁着那份决心,自己动手写了一个demo,虽然基础,但还是收获很多.
代码大致结构图如下:
从结构可以看出,非常简单,我就不一一说明了。
先来看看index.jsp的内容:
<script type="text/javascript">
<%if(request.getAttribute("msg")!=null){%>
alert("用户名和密码错误!!!");
<%}%>
</script>
</head>
<body>
<form id="formId" action="TestServlet1" method="post">
<table>
<tr><td>用户名</td><td><input type="text" id="name" name="name"></td></tr>
<tr><td>密码</td><td><input type="password" id="password"></td></tr>
<tr><td><input type="submit" value="登录" /></td></tr>
</table>
</form>
</body>
也就是两个输入框和一个提交按钮。method="post"表面使用post方式提交,这样就默认调用servlet里面的doPost方法了。
再来看看比较重要的的一部,web.xml:
<servlet>
<servlet-name>TestServlet2</servlet-name>
<servlet-class>com.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet2</servlet-name>
<url-pattern>/TestServlet1</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
看到这个地方大家要注意下,jsp中的TestServlet1是和web.xml里面的TestServlet1对应的,请求对应到TestServlet1,然后再找到TestServlet2,从而找到对应的servlet.
接下来看看servlet代码TestServlet.java:
public class TestServlet extends HttpServlet {
public TestServlet() {
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 {
request.setCharacterEncoding("UTF-8");
String name=(String) request.getParameter("name");
System.out.println("name==>"+name);
request.setAttribute("name", name);
if("zwm".equals(name)){
request.getRequestDispatcher("success.jsp").forward(request, response);//转发,是同一个请求,转发到的jsp可以得到request里面的属性值
}else{
request.setAttribute("msg", "用户名和密码错误!!!");
request.getRequestDispatcher("index.jsp").forward(request, response);//转发,是同一个请求,转发到的jsp可以得到request里面的属性值
//response.sendRedirect("index.jsp");//重定向,属于不同的请求,下个jsp无法得到request里面的值
}
}
public void init() throws ServletException {
// Put your code here
}
}
里面代码比较简单,只是对用户名进行了验证,如果用户名对了就跳转到成功页面,并将输入的用户名显示出来,如果不对则提示重新登录。由于下一个页面都需要获得request里面的属性值,所以只能用转发,不能使用重定向。
成功页面也就一行关键的代码:
<td>欢迎<%=request.getAttribute("name")%>登录</td>
在此期间遇到这样的一个问题,开始在servlet中居然无法通过request.getParameter("name")获得name的值,郁闷了很久,后来才知道 ,我在form上加了enctype="multipart/form-data" 这个属性,这样问题就来了,大家都知道,这个属性是在文件上传的时候使用的,使用multipart/form-data上传时,发送的请求和一般的http不一样,需要转化后才能读其他参数,所以这个地方使用request就没法获得属性值了。 看完觉得确实很简单,就是自己当初在学习的时候没有自己动手写一遍,也不至于被人给鄙视了,大家(java初学者)不妨自己试试,肯定有所收获的。
demo下载地址:http://download.csdn.net/detail/javaweiming/7023885