Android学习笔记(四十八):注册注销登录MVC模式案例

前提准备:

需要建立的包:


配置文件:


需要导入的包:


其中后面的三个包是先在WEB-INF目录下新建lib目录,然后将包复制粘贴到这个目录

注册功能的开发


一:dao开发

dao是下面的缩写

data access object
意思是数据访问对象的开发

我们首先建立存储用户数据的users.xml文件:


<?xml version="1.0" encoding="UTF-8"?>
<users>
	<user username="admin" password="admin" nickname="admin" eamil="admin@qq.com"/>
</users>

建立bean类user.java()


package com.javaweb.domain;

import java.io.Serializable;

public class User implements Serializable{
	
		private String username;
		private String password;
		private String password1;
		private String nickname;
		private String email;
		public String getUsername() {
			return username;
		}
		public void setUsername(String username) {
			this.username = username;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		public String getPassword1() {
			return password1;
		}
		public void setPassword1(String password1) {
			this.password1 = password1;
		}
		public String getNickname() {
			return nickname;
		}
		public void setNickname(String nickname) {
			this.nickname = nickname;
		}
		public String getEmail() {
			return email;
		}
		public void setEmail(String email) {
			this.email = email;
		}
}

再建立操作bean类和users.xml类的dao


package com.javaweb.dao;



import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;

import com.javaweb.domain.User;
import com.javaweb.util.XMLDaoUtils;

public class XmlUserDao {
	/*
	 * 通过用户名寻找用户
	 * 
	 */
	public User findUserByUserName(String username) {
		//在XML中查找具体username属性值等于传入的用户名的元素。
		Document dom=XMLDaoUtils.getDom();
		Element root=dom.getRootElement();
		
		List<Element> list=root.selectNodes("//user[@username='"+username+"']");
	    if(list.size()>0){//大于零说明找到了这个用户
	    	Element userEle=list.get(0);
	    	//将用户的信息封装到bean返回。
	    	User user=new User();
	    	user.setUsername(userEle.attributeValue("username"));
	    	user.setNickname(userEle.attributeValue("nickname"));
	    	user.setPassword(userEle.attributeValue("password"));
	    	user.setEmail(userEle.attributeValue("email"));
	    	return user;
	    }else{//说明没有找到这个用户。
	    	return null;
	    }
	}
	/*
	 * 添加用户
	 */
	public void addUser(User user){
		
	
		Document dom=XMLDaoUtils.getDom();
		Element root=dom.getRootElement();
	//1.凭空创建一个<user>元素,根据传入的user信息,设置此元素的属性
		Element userEle=DocumentHelper.createElement("user");
		userEle.setAttributeValue("username",user.getUsername() );
		userEle.setAttributeValue("password",user.getPassword());
		userEle.setAttributeValue("nickname",user.getNickname() );
		userEle.setAttributeValue("email",user.getEmail() );
	//挂载到<users>元素上
		root.add(userEle);	
	//回写到xml文件中
		XMLDaoUtils.refXml();
	}
	/*
	 * 根据用户名密码查找用户
	 */
	public User findUserByUNandPSW(String username,String password){
		//在XML中查找具体username属性值等于传入的用户名的元素。
		Document dom=XMLDaoUtils.getDom();
		Element root=dom.getRootElement();
		//在XML中查找具有username属性值等于传入的用户名 并且password等于传入密码的元素
		List<Element> list=root.selectNodes("//user[@username='"+username+"' and @password='"+password+"']");
	    if(list.size()>0){//大于零说明找到了这个用户
	    	Element userEle=list.get(0);
	    	//将用户的信息封装到bean返回。
	    	User user=new User();
	    	user.setUsername(userEle.attributeValue("username"));
	    	user.setNickname(userEle.attributeValue("nickname"));
	    	user.setPassword(userEle.attributeValue("password"));
	    	user.setEmail(userEle.attributeValue("email"));
	    	return user;
	    }else{//说明没有找到这个用户。
	    	return null;
	    }
	}
}

上面的有些方法需要工具类的支持:


package com.javaweb.util;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class XMLDaoUtils {
	private static Document dom=null;
	private static String path=XMLDaoUtils.class.getClassLoader().getResource("users.xml").getPath();
	private XMLDaoUtils(){
		
	}
	static{
		
		try {
			SAXReader reader=new SAXReader();
			dom=reader.read(path);
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static Document getDom(){
		return dom;
	}
	
	public static void refXml(){
		try {
			XMLWriter writer =new XMLWriter(new FileOutputStream(path),OutputFormat.createPrettyPrint());
			writer.write(dom);
			writer.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}

dao开发完毕

整个流程及作用就是这样:

user.xml 提供数据的存储支持,充当数据库的作用。

user.java 是一个javabean,能够封装用户的数据

XMLUserDao.java 则是为user,xml和user.java之间数据的传输提供支持。

XMLDaoUtils.java 是一个工具类,为XMLUserDao.java 的某些方法提供支持

二:注册用户1

上面已经完成了dao开发,有了充当数据存储的user.xml  和封装用户数据的bean类,以及操作bean类和users.xml类的dao,还有为dao提供方法的XMLDaoUtils工具类

注意:dao的作用就是在user.xml查找用户、添加用户、根据密码找用户名

            XMLDaoUtils.java是一个工具类,它为dao中的一些方法提供实现

接下来要干什么?

可以写一个测试类来测试上面的XMLUserDao是否正确?

package com.javaweb.test;

import org.junit.Test;

import com.javaweb.dao.XmlUserDao;
import com.javaweb.domain.User;

public class XMLUserDaoTest {
	
	//测试:根据用户名找用户
	@Test
	public void testFindUserByUserName(){
		XmlUserDao dao=new XmlUserDao();
		User user=dao.findUserByUserName("admin");
		System.out.println(user);
	}
	//测试:根据用户名和密码查找用户
	@Test
	public void testFindUserByNMandPSW(){
		XmlUserDao dao=new XmlUserDao();
		User user=dao.findUserByUNandPSW("admin", "admin11");
		System.out.println(user);
	}
	//测试:添加用户名
	@Test
	public void testAddUser(){
		XmlUserDao dao=new XmlUserDao();
		User user=new User();
		user.setUsername("小号");
		user.setPassword("4569df");
		user.setNickname("红红");
		user.setEmail("xiaohong@.com");
		dao.addUser(user);
	}
}


上面的测试都正确,下面我们来开发Service

先开发 UserService.java    这个是添加用户名和检查密码是否正确

package com.javaweb.service;

import com.javaweb.dao.XmlUserDao;
import com.javaweb.domain.User;
import com.javaweb.exception.MsgException;



public class UserService {
	
	private XmlUserDao dao=new XmlUserDao(); 
	/* 
	 * 添加用户
	 */
	
	public void registUser(User user)throws MsgException{
		//1.检查用户名是否已经存在,如果存在就提示
		
		if(dao.findUserByUserName(user.getNickname())!=null){
		  throw new MsgException("用户名已经存在");
		}
		 //2.如果不存在,则调用dao中的方法添加用户
		dao.addUser(user);
	}
	/*
	 * 检查用户密码是否正确
	 */
	public User isUser(String username,String password){
		return dao.findUserByUNandPSW(username, password);
	}
}
上面需要一个异常支持,就开发异常:

package com.javaweb.exception;

public class MsgException extends Exception {
	 public MsgException(){
			
		}
	public MsgException(String msg){
			super(msg);
	}
}

接着我们来开发web jsp 开发主页:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
  <head>
  
  </head>
  
  <body>
    <h1>我的网站</h1>
     <c:if test="${sessionScope.user==null}">
    	欢迎光临游客<a href="${pageContext.request.contextPath}/regist.jsp">注册</a>
    			 <a href="${pageContext.request.contextPath}/login.jsp">登录</a>
    </c:if>
    <c:if test="${sessionScope.user!=null}">
    	欢迎回来!${sessionScope.user.username}!<a href="${pageContext.request.contextPath}/servlet/LogoutServlet">注销</a>
    </c:if>
  </body>
</html>

在浏览器中输入: http://localhost/User/

可以看到:


从上面可以看到有两个jsp页面

一个是regist.jsp注册页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <script type="text/javascript">
  		function changeImg(img){
  			img.src=img.src+"?time="+new Date().getTime();
  		}
  </script>
  <body style="text-align:center;">
   
 <h1>我的网站注册的功能</h1>
 <hr>
 <font color="red">${msg} }</font>
 <form  action="${pageContext.request.contextPath}/servlet/RegistServlet" method="POST">
 <table border="1">

 	<tr>
 		<td>用户</td>
 		<td><input type="text" name="username"></input></td>
 	</tr>
 	<tr>
 		<td>密码</td>
 		<td><input type="password" name="password"></input></td>
 	</tr>
 	<tr>
 		<td>确认密码</td>
 		<td><input type="password" name="password1"></input></td>
 	</tr>
 	<tr>
 		<td>昵称</td>
 		<td><input type="text" name="nickname"></input></td>
 	</tr>
 	<tr>
 		<td>邮箱</td>
 		<td><input type="text" name="email"></input></td>
 	</tr>
 	<tr>
 		<td>验证码</td>
 		<td><input type="text" name="valistr"></input></td>
 	</tr>
 	<tr>
 		
 		<td><input type="submit" name="valist"></input></td>
 		<td><img src="${pageContext.request.contextPath}/servlet/ValiImg" style="cursor:pointer" οnclick="changeImg(this)"/></td>
 	</tr>
 	 </table>
 </form>
  </body>
</html>

点击上面的注册就可以跳转到这个页面:


上面有一个很重要的功能是RegistServlet.java来实现的,下面是没有开发全部的java页面,功能只是可以用来校验验证码:

package com.javaweb.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegistServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//下面的两句话很重要,没有的话,会乱码的
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		//1.检验验证码
		String valistr=req.getParameter("valistr");	
		String valistr2=(String) req.getSession().getAttribute("valistr");
		if(valistr==null||valistr2==null||!valistr.equals(valistr2)){
			System.out.println("valistr:"+valistr);
			System.out.println("valistr2:"+valistr2);
			req.setAttribute("msg", "验证码不正确");
			req.getRequestDispatcher("/regist.jsp").forward(req, resp);
			return;
		}
		//2.封装数据
		//3 调用Service中的方法添加用户
		//4.提示注册成功,3秒回到主页
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req,resp);
	}

}

假如添加验证码错误会怎么样?下面故意填错验证码。


如果提交的话,会发生这样的变化


那么如何让数据回显?

可以修改Regist.jsp的页面,添加value值

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <script type="text/javascript">
  		function changeImg(img){
  			img.src=img.src+"?time="+new Date().getTime();
  		}
  </script>
  <body style="text-align: center">
   
 <h1>我的网站注册的功能</h1>
 <hr>
 <font color="red">${msg}</font>
 <form  action="${pageContext.request.contextPath}/servlet/RegistServlet" method="POST">
 <table border="1">

 	<tr>
 		<td>用户${pageContext.request.contextPath}</td>
 		<td><input type="text" name="username" value="${param.username}"></input></td>
 	</tr>
 	<tr>
 		<td>密码</td>
 		<td><input type="password" name="password"></input></td>
 	</tr>
 	<tr>
 		<td>确认密码</td>
 		<td><input type="password" name="password1"></input></td>
 	</tr>
 	<tr>
 		<td>昵称</td>
 		<td><input type="text" name="nickname" value="${param.nickname}" ></input></td>
 	</tr>
 	<tr>
 		<td>邮箱</td>
 		<td><input type="text" name="email" value="${param.email}"></input></td>
 	</tr>
 	<tr>
 		<td>验证码</td>
 		<td><input type="text" name="valistr"></input></td>
 	</tr>
 	<tr>
 		
 		<td><input type="submit" name="valist"></input></td>
 		<td><img src="${pageContext.request.contextPath}/servlet/ValiImg" style="cursor:pointer" οnclick="changeImg(this)"/></td>
 	</tr>
 	 </table>
 </form>
  </body>
</html>
这个时候再填错的话,那么就会保留之前的数据:


如果输入正确的话,那么会怎么样?


就会跳转到,这个页面


下面是封装数据和校验数据

package com.javaweb.web;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.javaweb.domain.User;
import com.javaweb.exception.MsgException;

public class RegistServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		try {
			
		//下面的两句话很重要,没有的话,会乱码的
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		//1.检验验证码
		String valistr=req.getParameter("valistr");	
		String valistr2=(String) req.getSession().getAttribute("valistr");
		if(valistr==null||valistr2==null||!valistr.equals(valistr2)){
			System.out.println("valistr:"+valistr);
			System.out.println("valistr2:"+valistr2);
			req.setAttribute("msg", "验证码不正确");
			req.getRequestDispatcher("/regist.jsp").forward(req, resp);
			return;
		}
		//2.封装数据校验数据
		User user=new User();
		//原本封装数据是要将属性一一的封装进去
		//但是这样太麻烦了,这里提供了一个工具类就是BeanUtils,它能将表单的数据一一封装到User类里面
		BeanUtils.populate(user,req.getParameterMap());
		//这时校验数据,checkValue()在User已经写好
		user.checkValue();
		
		
		//3 调用Service中的方法添加用户
		//4.提示注册成功,3秒回到主页
		 }catch (MsgException e) {
			 //下面是抛出异常,显示在regist.jsp页面上
			req.setAttribute("msg", e.getMessage());
			req.getRequestDispatcher("/regist.jsp").forward(req, resp);
			return;
		}catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req,resp);
	}

}

封装数据的时候,引入了一个工具类

BeanUtils.populate(user,req.getParameterMap());
它的作用,如下图所示


而检验数据,可以在User.java类中写方法

package com.javaweb.domain;

import java.io.Serializable;

import com.javaweb.exception.MsgException;

public class User implements Serializable{
	
		private String username;
		private String password;
		private String password1;
		private String nickname;
		private String email;
		public String getUsername() {
			return username;
		}
		public void setUsername(String username) {
			this.username = username;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		public String getPassword1() {
			return password1;
		}
		public void setPassword1(String password1) {
			this.password1 = password1;
		}
		public String getNickname() {
			return nickname;
		}
		public void setNickname(String nickname) {
			this.nickname = nickname;
		}
		public String getEmail() {
			return email;
		}
		public void setEmail(String email) {
			this.email = email;
		}
		@Override
		public String toString() {
			return "username:"+username;
		}
		
		public void checkValue() throws MsgException{
			
			if(username==null || "".equals(username)){
				throw new MsgException("用户名不能为空!");
			}
			if(password==null || "".equals(password)){
				throw new MsgException("密码不能为空!");
			}
			if(password1==null || "".equals(password1)){
				throw new MsgException("确认密码不能为空!");
			}
			if(!password.equals(password1)){
				throw new MsgException("两次密码不一致!");
			}
			if(nickname==null || "".equals(nickname)){
				throw new MsgException("昵称不能为空!");
			}
			if(email==null || "".equals(email)){
				throw new MsgException("邮箱不能为空!");
			}
			//邮箱格式要用正则表达式,可以在String类找到正则表达式的公式
			if(!email.matches("^\\w+@\\w+(\\.\\w+)+$")){
				throw new MsgException("邮箱格式不正确!");
			}
		
		}
		
}

假如用户名不填的话


那么就会反馈出错误


有了这些反馈错误了之后,我们继续完善添加用户和回到主页的功能

下面是完善后的RegistServlet.java代码

package com.javaweb.web;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.javaweb.domain.User;
import com.javaweb.exception.MsgException;
import com.javaweb.service.UserService;

public class RegistServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		try {
		UserService service = new UserService();
		//下面的两句话很重要,没有的话,会乱码的
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		//1.检验验证码
		String valistr=req.getParameter("valistr");	
		String valistr2=(String) req.getSession().getAttribute("valistr");
		if(valistr==null||valistr2==null||!valistr.equals(valistr2)){
			System.out.println("valistr:"+valistr);
			System.out.println("valistr2:"+valistr2);
			req.setAttribute("msg", "验证码不正确");
			req.getRequestDispatcher("/regist.jsp").forward(req, resp);
			return;
		}
		//2.封装数据校验数据
		User user=new User();
		//原本封装数据是要将属性一一的封装进去
		//但是这样太麻烦了,这里提供了一个工具类就是BeanUtils,它能将表单的数据一一封装到User类里面
		BeanUtils.populate(user,req.getParameterMap());
		//这时校验数据,checkValue()在User已经写好
		user.checkValue();
		
		//3 调用Service中的方法添加用户
		//要添加用户,其实之前已经写好了类,这就是UserService 可以利用它的方法registUser来添加用户
		service.registUser(user);
		//4.登录用户
		req.getSession().setAttribute("user", user);
		//5.提示注册成功3秒回到主页
		resp.getWriter().write("恭喜您注册成功!3秒回到主页....");
		resp.setHeader("refresh", "3;url="+req.getContextPath()+"/index.jsp");
		 }catch (MsgException e) {
			 //下面是抛出异常,显示在regist.jsp页面上
			req.setAttribute("msg", e.getMessage());
			req.getRequestDispatcher("/regist.jsp").forward(req, resp);
			return;
		}catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doGet(req,resp);
	}

}
然后在浏览器输入:http://localhost/User 便可显示


点击注册,填好注册信息


然后点击,便会出现这样的界面


接着跳转到主页


那么里面填写的数据有没有存在数据库中?我们可以打开User.xml可以看到


注销功能的开发
上面已经基本开发好注册的功能,现在来开发注销的功能,注销的功能比较简单,就是将session注销就可以了,在com.javaweb.web新建一个页面LogoutServlet.java

package com.javaweb.web;


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogoutServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		if(request.getSession(false)!=null && request.getSession().getAttribute("user")!=null){
			request.getSession().invalidate();
		}
		response.sendRedirect(request.getContextPath()+"/index.jsp");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

另外和RegistServlet.java一样,要在web.xml配置访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  	<servlet>
  		<servlet-name>ValiImg</servlet-name>
  		<servlet-class>com.javaweb.web.ValiImg</servlet-class>
  	</servlet>
  	<servlet-mapping>
  		<servlet-name>ValiImg</servlet-name>
  		<url-pattern>/servlet/ValiImg</url-pattern>
  	</servlet-mapping>
  	
  	<servlet>
  		<servlet-name>RegistServlet</servlet-name>
  		<servlet-class>com.javaweb.web.RegistServlet</servlet-class>
  	</servlet>
  	<servlet-mapping>
  		<servlet-name>RegistServlet</servlet-name>
  		<url-pattern>/servlet/RegistServlet</url-pattern>
  	</servlet-mapping>
  	
  	
  	<servlet>
  		<servlet-name>LogoutServlet</servlet-name>
  		<servlet-class>com.javaweb.web.LogoutServlet</servlet-class>
  	</servlet>
  	<servlet-mapping>
  		<servlet-name>LogoutServlet</servlet-name>
  		<url-pattern>/servlet/LogoutServlet</url-pattern>
  	</servlet-mapping>
  	
  	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
这样子,当点击注销的时候,就会注销了


登录功能的开发

但我们点击登录的时候,要有一个页面出来,下面我们就写出这个页面出来login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    

  </head>
  
  <body>
  	<div align="center">
 	<h1>我的网站_登录</h1><hr>
 	<font color="red">${msg }</font>
 	<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="POST">
		<table border="1">
			<tr>
				<td>用户名:</td>
				<td><input type="text" name="username" />
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="password"/></td>
			</tr>
			<tr>
				<td><input type="submit" value="登录"/></td>
			</tr>
		</table>
 	</form>
 	</div>
  </body>
</html>
当点击登录的时候,可以出现这个页面


但是如果填入数据,那么出现下面的页面


因为还需要写一个LoginServlet.java来处理它的页面逻辑

下面是已经写好的

package com.javaweb.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.javaweb.domain.User;
import com.javaweb.service.UserService;

public class LoginServlet extends HttpServlet {

	
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=utf-8");
		
		UserService service = new UserService();
		//1.获取客户端提交的用户名密码
		String username=req.getParameter("username");
		String password=req.getParameter("password");
		//2.调用Service中的方法检查用户名密码
		User user=service.isUser(username, password);
		if(user==null){
		//3.如果不正确则提示
			req.setAttribute("msg", "用户名密码不正确!");
			req.getRequestDispatcher("/login.jsp").forward(req, resp);
			return;
		}else{
		//4.正确则登录用户后重定向回到主页
			req.getSession().setAttribute("user", user);
			resp.sendRedirect(req.getContextPath()+"/index.jsp");
		}
	}


	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		doGet(req, resp);
	}

}

记得在web.xml配置访问路径

        <servlet>
  		<servlet-name>LoginServlet</servlet-name>
  		<servlet-class>com.javaweb.web.LoginServlet</servlet-class>
  	</servlet>
  	<servlet-mapping>
  		<servlet-name>LoginServlet</servlet-name>
  		<url-pattern>/servlet/LoginServlet</url-pattern>
  	</servlet-mapping>

假如输入的密码是不正确的,那么会

显示密码错误

如果密码正确的话

那么就会自动跳转到页面

上面的虽然用登录的页面了,但是我们想让登录的页面有保存用户名的功能,那么如何开发?

先在login.jsp页面添加代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    

  </head>
  
  <body>
  	<div align="center">
 	<h1>我的网站_登录</h1><hr>
 	<font color="red">${msg }</font>
 	<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="POST">
		<table border="1">
			<tr>
				<td>用户名:</td>
				<td><input type="text" name="username" />
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="password"/></td>
			</tr>
			<tr>
				<td><input type="submit" value="登录"/></td>
				<td><input type="checkbox" value="ok" name="remname" 
				/>记住用户名</td>
			</tr>
		</table>
 	</form>
 	</div>
  </body>
</html>
上面的代码,就会变成这个页面


这个时候还需要在LoginServlet.java页面上做改动

package com.javaweb.web;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.javaweb.domain.User;
import com.javaweb.service.UserService;

public class LoginServlet extends HttpServlet {

	
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=utf-8");
		
		UserService service = new UserService();
		//1.获取客户端提交的用户名密码
		String username=req.getParameter("username");
		String password=req.getParameter("password");
		//2.调用Service中的方法检查用户名密码
		User user=service.isUser(username, password);
		if(user==null){
		//3.如果不正确则提示
			req.setAttribute("msg", "用户名密码不正确!");
			req.getRequestDispatcher("/login.jsp").forward(req, resp);
			return;
		}else{
		//4.正确则登录用户后重定向回到主页
			req.getSession().setAttribute("user", user);
		//在跳转到主页的时候,要先保存cookies信息(这是保存在浏览器的,
		//因为如果保存在服务器session的话,时间只有30分钟,而且会加重服务器的负担)
			if("ok".equals(req.getParameter("remname"))){
				//如果用户勾选过记住用户则发送cookie另浏览器保存用户名
				Cookie remNameC = new Cookie("remname",URLEncoder.encode(user.getUsername(), "utf-8"));
				remNameC.setPath(req.getContextPath());
				remNameC.setMaxAge(3600*24*30);
				resp.addCookie(remNameC);
			}else{
				//如果用户没有勾选记住用户名则删除记住用户名的cookie
				Cookie remNameC = new Cookie("remname","");
				remNameC.setPath(req.getContextPath());
				remNameC.setMaxAge(0);
				resp.addCookie(remNameC);
			}
			resp.sendRedirect(req.getContextPath()+"/index.jsp");
		}
	}


	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		
		doGet(req, resp);
	}

}
上面已经保存了cookie,所以还需要在login.jsp上接收

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    

  </head>
  
  <body>
  	<div align="center">
 	<h1>我的网站_登录</h1><hr>
 	<font color="red">${msg }</font>
 	<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="POST">
		<table border="1">
			<tr>
				<td>用户名:</td>
				<td><input type="text" name="username" value=${cookie.remname.value}/>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="password"/></td>
			</tr>
			<tr>
				<td><input type="submit" value="登录"/></td>
				<td><input type="checkbox" value="ok" name="remname" 
				/>记住用户名</td>
			</tr>
		</table>
 	</form>
 	</div>
  </body>
</html>

上面添加了,就是接收的值

value=${cookie.remname.value}

但是我们发现,确是URL编码的

所以我们还是需要自己定义一个标签来转换编码,因为没有现成的标签。

先建立一个包

然后建立一个类URLDEcoderTag.java

package com.javaweb.tag;

import java.io.IOException;
import java.net.URLDecoder;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class URLDEcoderTag extends SimpleTagSupport {

	private String content;
	private String encode;
	public void setContent(String content) {
		this.content = content;
	}
	public void setEncode(String encode) {
		this.encode = encode;
	}
	
	@Override
	public void doTag() throws JspException, IOException {
		String str = URLDecoder.decode(content, encode == null ? "UTF-8" : encode);
		getJspContext().getOut().write(str);
	}

}
然后建立它的描述文件 ZhuanURL.tld

在文件添加内容

 

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
 <tlib-version>1.0</tlib-version>
 <short-name>ZhuanURL</short-name>
 <uri>http://www.cuixueyong.com</uri>
 <tag>
  <name>ZhuanURL</name>
  <tag-class>com.javaweb.tag.URLDEcoderTag</tag-class>
  <body-content>empty</body-content>
  <attribute>
   <name>encode</name>
   <required>true</required>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
  <attribute>
   <name>content</name>
   <rtexprvalue>true</rtexprvalue>
   <type>java.lang.String</type>
  </attribute>
 </tag>
</taglib>

接着就引入到login.jsp页面中来

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.cuixueyong.com" prefix="UserTag" %>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    

  </head>
  
  <body>
  	<div align="center">
 	<h1>我的网站_登录</h1><hr>
 	<font color="red">${msg }</font>
 	<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="POST">
		<table border="1">
			<tr>
				<td>用户名:</td>
				<td><input type="text" name="username" value="<UserTag:ZhuanURL content="${cookie.remname.value }" encode="utf-8"/>"/></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="password"/></td>
			</tr>
			<tr>
				<td><input type="submit" value="登录"/></td>
				<td><input type="checkbox" value="ok" name="remname" 
				/>记住用户名</td>
			</tr>
		</table>
 	</form>
 	</div>
  </body>
</html>

 这时候就可以显示了

但是这里会有一个问题是,返回来的时候,记住用户名是没有勾选的,所以我们要实现返回来的时候,是勾选上的

 这个主要是改动login.jsp的代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.cuixueyong.com" prefix="UserTag" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    

  </head>
  
  <body>
  	<div align="center">
 	<h1>我的网站_登录</h1><hr>
 	<font color="red">${msg }</font>
 	<form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="POST">
		<table border="1">
			<tr>
				<td>用户名:</td>
				<td><input type="text" name="username" value="<UserTag:ZhuanURL content="${cookie.remname.value }" encode="utf-8"/>"/></td>
			</tr>
			<tr>
				<td>密码:</td>
				<td><input type="password" name="password"/></td>
			</tr>
			<tr>
				<td><input type="submit" value="登录"/></td>
				<td><input type="checkbox" value="ok" name="remname" 
					<c:if test="${cookie.remname!=null }">
						checked="checked" 
					</c:if>
				/>记住用户名</td>
			</tr>
		</table>
 	</form>
 	</div>
  </body>
</html>
到此为止,基本的登录功能已经做好的

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          


 


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值