这学期上课教了JSP,其实是很抵触学这个东西的,毕竟是一个已经被淘汰的技术,但是学了一点html的东西和一些前端的思想还是不错的。期末的时候要求通过servlet写一个登录和注册的功能。
思路:
- 首先注册信息,然后登录检测是否与已经注册过的信息匹配,若匹配就登录成功,不匹配就登录失败。所以需要登录页面、注册页面、登录成功页面、登录失败页面
- servlet其实就是一个实现了Servlet接口的java代码程序,在服务器端运行,实现http请求和响应与客户端进行交互,在这个功能中使用servlet进行注册信息的记录和登录信息的匹配
- 使用一个User类来存每一个用户注册的信息,在servlet中用vector存若干个User类的对象,每注册一个信息就添加一个新对象,匹配时遍历所有的对象一一进行匹配
难点:
- 原本想使用两个servlet一个负责匹配登录,一个负责注册,注册完后把注册的信息再传给负责匹配的servlet的用户信息Vector中,两个servlet之间传数据要用到request.setAttribute和request.getAttribute方法,或者使用request.getSession获得一个session来存数据,弄了半天之后发现这样太麻烦还不如直接用一个servlet来处理这两个事情。
- 在选择servlet执行哪个功能时,用一个if判断这个请求来自哪一个页面,要使用request.getHeader(“Referer”)方法就能得到request来源页面的地址
- 从servlet向jsp页面传数据不能用session得不到值,要用request.setAttribute(“success”, nowUser); request.getRequestDispatcher(“Success.jsp”).forward(request, response);
完整代码如下:
登录页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>登录界面</title>
</head>
<body>
<form action="LoginServlet" method="post"> <!-- 表单向servlet传登录信息 -->
<table width="298" border="0" align="center">
<tr>
<td align="right">用户名</td>
<td align="left">
<input type="text" name="user"/> <!-- 输入用户名文本框 -->
</td>
</tr>
<tr>
<td align="right">密码</td>
<td align="left">
<input type="password" name="password"> <!-- 输入密码文本框 -->
</td>
</tr>
<td colspan="2" align="center">
<input type="submit" value="登录">
<a href="register.jsp">注册</a>
</td>
</tr>
</table>
</form>
</body>
</html>
登录失败页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>登录失败</title>
</head>
<body>
<p>用户名或密码错误
<br>
<a href="index.jsp">重新登录</a> <!-- 返回登录页面 -->
</body>
</html>
```java
注册页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>注册页面</title>
</head>
<body>
<form action="LoginServlet" method="post"> <!-- 表单向servlet传注册信息 -->
<table width="298" border="0" align="center">
<tr>
<td align="right">用户名</td>
<td align="left">
<input type="text" name="user">
</td>
</tr>
<tr>
<td align="right">密码</td>
<td align="left">
<input type="password" name="password">
</td>
</tr>
</tr>
<td colspan="2" align="center">
<input type="submit" value="注册">
<a href="index.jsp">取消</a>
</td>
</tr>
</table>
</form>
</body>
</html>
登录成功页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<%
String name = (String)request.getAttribute("success") ; //要转类型
%>
<p>登陆成功,欢迎你,<%=name %>
<br>
<a href="index.jsp">退出</a> <!-- 返回登录页面 -->
</body>
</html>
servlet
package com;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginServlet extends HttpServlet {
Vector<Users> users = new Vector<Users>() ; //存多个用户注册信息
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 {
if(request.getHeader("Referer").equals("http://localhost:8080/Login/register.jsp")) //请求来源是注册
register(request, response) ; //注册函数
else if(request.getHeader("Referer").equals("http://localhost:8080/Login/index.jsp")){ //请求来源是登录
check(request, response) ; //登录函数
}
}
public void init() throws ServletException {
super.init();
}
public void register(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8") ; //注册前先设置编码格式
String userName = request.getParameter("user") ;
String password = request.getParameter("password") ;
Users newUser = new Users(userName, password) ; //创建新的用户信息
users.add(newUser) ; //将新用户添加进vector
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print("<a href=\"index.jsp\">注册成功</a>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
public void check(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8") ; //登录前设置编码格式不然识别不出中文
String nowUser = request.getParameter("user") ;
String nowPassword = request.getParameter("password") ;
Users check ;
boolean flag = true ; //记录是否匹配成功
for(int i=0; i<users.size(); i++) { //遍历整个注册信息
check = users.get(i) ;
if(nowUser.equals(check.getUserName()) && nowPassword.equals(check.getPassword())) {
flag = false ;
request.setAttribute("success", nowUser); //向jsp页面传数据
request.getRequestDispatcher("Success.jsp").forward(request, response); //登录成功
break ;
}
}
if(flag)
response.sendRedirect("failure.jsp") ; //登录失败
return ;
}
}
Users用户信息类
package com;
public class Users { //存用户信息的类
private String userName ; //用户名
private String password ; //密码
public Users(String userName, String password) {
this.userName = userName ;
this.password = password ;
}
public void setUserName(String newName) {
userName = newName ;
}
public void setPassWord(String newPass) {
password = newPass ;
}
public String getUserName() {
return userName ;
}
public String getPassword() {
return password ;
}
}
总结:
-
要得到rquest来源地址要用:
request.getHeader(“Referer”)方法就能得到request来源页面的地址
要得到执行request地址可用:
request.getRequestURL() 返回全路径 http://localhost:8080/Login/index.jsp
request.getRequestURI() 返回除去host(域名或者ip)部分的路径 Login/index.jsp
request.getContextPath() 返回工程名部分,如果工程映射为/,此处返回则为空 Login
request.getServletPath() 返回除去host和工程名部分的路径 LoginServlet -
我出现了HTTP Status 500 - Cannot call sendRedirect() after the response has been committed这个问题好像是因为在一个方法里重复出现了response,用if ,else之类的东西分开就解决了
-
注册的用户名是中文会出现乱码,导致匹配不到相同的用户名或者输出的用户名是乱码,解决方法是在注册完跳转到servlet时和form表单传数据时用request.setCharacterEncoding(“UTF-8”) 转变编码格式
-
在使用servlet时,创建文件要选择servlet文件,还要在项目中的WebRoot/WEB-INF文件夹中的web.xml文件中配置servlet的格式
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
JSP前后端没有完全分离,是已经被淘汰的技术,所有我一开始是有点抵触学的感觉有点没意思,但是通过学JSP还学了一些HTML的东西还是比较好的,也对网页开发有了一点认识。