前提准备:
需要建立的包:
配置文件:
需要导入的包:
其中后面的三个包是先在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);
}
}
先开发 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>
到此为止,基本的登录功能已经做好的