首先先对上一次的功能进行一个小优化,我们之前通过servlet进行控制来跳转相应的JSP页面,那么用户是可以直接就访问到JSP页面的,此时我们可以将相应的JSP页面放置WEB-INF文件中,那么用户将无法直接访问相应的JSP页面,只能通过访问servlet来进行跳转。
那么现在如果说我们通过servlet跳转到main.jsp页面,如果main要显示很多的内容,这时都用同一个servlet进行验证的话,将会显得特别的混乱,那么我们可以进一步的进行优化,将功能进行拆分,然后通过重定向进行转发,这样的代码更加的简洁。
首先先加一个业务逻辑类UserService,用于判断登录的成功与否
package cn.edu.mju.project1.service;
import cn.edu.mju.project1.entity.User;
public class UserService {
public User login(String loginName, String pwd) {
//通过loginName条件到数据库中查询此用户信息
User saveUser = new User(1, "16", "1234", "张三", null);
if (saveUser != null && saveUser.getName().equals(loginName) && saveUser.getPwd().equals(pwd)) {
return saveUser;
} else {
return null;
}
}
}
然后添加一个实体类
package cn.edu.mju.project1.entity;
import java.util.Date;
public class User {
private Integer id; //不要用简单数据类型声明,因为简单类型默认值为0,而Integer默认为null
private String name;
private String pwd;
private String nickname;
private Date birthday;
public User() {
}
public User(Integer id){
this.id = id;
}
public User(Integer id, String name, String pwd, String nickname, Date birthday) {
this.id = id;
this.name = name;
this.pwd = pwd;
this.nickname = nickname;
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
那么还有一个问题,如果说一个servlet负责多个页面的话就会显得特别的复杂,还占用资源,并且容易出错,所以一般情况下,我们使用的MVC模式都是一个controller对应一个视图。
那么我们再创建一个main的controller
package cn.edu.mju.project1.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/main")
public class MainController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//准备主界面中的数据,放置到req对象里面
req.getRequestDispatcher("/WEB-INF/template/main.jsp").forward(req,resp);
}
}
login代码:
package cn.edu.mju.project1.controller;
import cn.edu.mju.project1.entity.User;
import cn.edu.mju.project1.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLEncoder;
@WebServlet("/login")
public class LoginController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/template/login.jsp").forward(req,resp);//将数据转发到login.jsp
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//login.jsp提交到这里
//进行控制,对其进行判断
String loginName=req.getParameter("loginName");
String loginPwd=req.getParameter("loginPwd");
String validCode = req.getParameter("validCode");
String saveCode = (String)req.getSession().getAttribute("code");
String str = null;
if(saveCode != null){
if(saveCode.equals(validCode)){
UserService service = new UserService();
User user = service.login(loginName,loginPwd);
if(user != null){
req.getSession().setAttribute("user",user);
resp.sendRedirect("./main");
// req.setAttribute("name",str);
// req.getRequestDispatcher("/WEB-INF/template/main.jsp").forward(req,resp);//成功跳转到main.jsp页面
}else{
loginFail(req,resp,"账号或密码错误");
}
}else{
loginFail(req,resp,"验证码错误");
}
}else{
loginFail(req,resp,"请输入验证码");
}
}
private void loginFail(HttpServletRequest req, HttpServletResponse resp,String str) throws ServletException, IOException {
//req.setAttribute("msg",str); //把错误信息通过req带过去
resp.sendRedirect("./login?err=" + URLEncoder.encode(str,"UTF-8"));
//req.getRequestDispatcher("/WEB-INF/template/fail.jsp").forward(req,resp); //校验失败后跳转到fail.jsp
}
}
实验效果图
登录界面:
账户或密码错误:
验证码错误:
登录成功:
通过MVC的模式来实现登录界面的功能,可以发现条理更加的清晰,就类似于团队分工合作,各自完成各自的任务。