JSP+servlet实现登录与注册功能

这学期上课教了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的东西还是比较好的,也对网页开发有了一点认识。

发布了21 篇原创文章 · 获赞 51 · 访问量 3166

猜你喜欢

转载自blog.csdn.net/weixin_44689154/article/details/103543161