本应用需要底层数据库的支持,读者可以在MySQL中创建一个login的数据库,在login库中创建user_inf表,里面包含name,pass!
以下是应用的登录页面。
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>登录</title> 8 </head> 9 10 <body> 11 12 13 <!-- request.getAttribute("err")可得到JSP页面一表单中控件的Value。使用JSP脚本输出错误提示 --> 14 <span class="tip" style="color:red;font-weight: bolder;"> 15 <%if(request.getAttribute("err") != null){ 16 out.println(request.getAttribute("err")+"<br/>"); 17 } 18 %> 19 </span> 20 21 请输入用户名和密码: 22 <!-- 登录表单,将表单提交到一个Servlet中 --> 23 <form action="login" id="login" method="post"> 24 用户名:<input type="text" name="username"><br/><br/> 25 密 码:<input type="password" name="password"><br/><br/> 26 <input type="submit" value="登录"><br/> 27 </form> 28 29 </body> 30 </html>
以上除了一个jsp脚本输出错误提示外,余下的是一个简单的表单页面。根据严格的MVC规范,以上的login.jsp页面不应该被客户直接访问,客户的请求应该先发送到指定Servlet,然后由Servlet将请求发送到jsp页面。
控制器Servlet: LoginServlet如下:
1 package test; 2 3 import test.Dbdao; 4 5 import java.io.IOException; 6 import java.sql.ResultSet; 7 8 import javax.servlet.RequestDispatcher; 9 import javax.servlet.ServletException; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import javax.servlet.http.HttpSession; 15 16 /** 17 * Servlet implementation class loginServlet 18 */ 19 /*使用@WebServlet注解为该Servlet配置了URl为/jsp/login,因此想/login发送的请求将会交给该Servlet处理*/ 20 @WebServlet(name="login",urlPatterns={"/jsp/login"}) 21 public class LoginServlet extends HttpServlet { 22 private static final long serialVersionUID = 1L; 23 //响应客户端请求的方法 24 public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException { 25 String errMSG = "";//错误信息 26 RequestDispatcher rd;//在Servlet中使用RequestDispatcher对象的forward进行页面的跳转 27 28 String username = request.getParameter("username");//获取请求的参数,从jsp中的表单中获取,以表单的名字获取客户端输入的信息 29 String password = request.getParameter("password");//获取请求的参数,从jsp中的表单中获取,以表单的名字获取客户端输入的信息 30 try{ 31 /*连接数据库,Servlet本身不执行任何的业务逻辑处理,它调用javabean处理用户请求*/ 32 Dbdao dd = new Dbdao("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/login","root","123456"); 33 /*查询结果集*/ 34 ResultSet rs = dd.query("select pass from user_inf" + " where name = ?", username); 35 if(rs.next()){ 36 /*判断login页面输入的用户名和密码是否匹配*/ 37 if(rs.getString("pass").equals(password)){ 38 HttpSession session = request.getSession();//获取session对象 39 session.setAttribute("name", username);//设置session属性,跟踪用户会话状态 40 rd = request.getRequestDispatcher("/jsp/welcome.jsp");//在Servlet中使用RequestDispatcher对象的forward进行页面的跳转,获取转发对象 41 rd.forward(request, response);//转发请求 42 43 }else{ 44 /*用户名和密码不匹配时*/ 45 errMSG += "您的用户名密码不符合,请重新输入"; 46 } 47 }else{ 48 /*用户名不存在时*/ 49 errMSG += "您的用户名不存在,请注册"; 50 } 51 }catch (Exception e){ 52 e.printStackTrace(); 53 } 54 /*设置出错,转发到login.jsp重新登录*/ 55 if(errMSG != null && !errMSG.equals("")){ 56 rd = request.getRequestDispatcher("/jsp/login.jsp"); 57 request.setAttribute("err", errMSG); 58 rd.forward(request, response); 59 } 60 } 61 62 }
控制器负责接收客户端的请求,它既不直接对客户端输出响应,也不处理用户请求,只调用JavaBean来处理用户请求;javaBean处理结束后,Servlet根据处理结果,调用不用的jsp页面向浏览器呈现处理结果。最后是应用的DbDao的编写:
package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class Dbdao { private Connection conn;//数据库连接 private String driver;//数据库的驱动 private String url;//数据库地址 private String username;//数据库用户名 private String password;//数据库的密码 public Dbdao(){}//无参构造 /*带参构造*/ public Dbdao(String driver,String url,String username,String password){ this.driver = driver; this.url = url; this.username = username; this.password = password; } /*各个成员属性的setter和getter方法*/ public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } 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 Connection getConnection() throws Exception{ if(conn == null){ Class.forName(this.driver); conn = DriverManager.getConnection(url,username,this.password); } return conn; } /*插入记录*/ public boolean insert(String sql,Object...args) throws Exception{ PreparedStatement pstmt = getConnection().prepareStatement(sql); for(int i=0;i<args.length;i++){ pstmt.setObject(i+1, args[i]); } if(pstmt.executeUpdate() != 1){ return false; } return true; } /*执行查询*/ public ResultSet query (String sql,Object...args) throws Exception{ PreparedStatement pstmt = getConnection().prepareStatement(sql); for(int i = 0;i<args.length;i++){ pstmt.setObject(i+1, args[i]); } return pstmt.executeQuery(); } /*执行修改*/ public void modify(String sql,Object...args)throws Exception{ PreparedStatement pstmt = getConnection().prepareStatement(sql); for(int i = 0;i<args.length;i++){ pstmt.setObject(i+1, args[i]); } pstmt.executeUpdate(); pstmt.close(); } /*关闭数据库连接释放资源的方法*/ public void closeConn() throws Exception{ if(conn != null && !conn.isClosed()){ conn.close(); } } }
DbDao负责完成查询、插入、修改等操作。整个应用的流程是非常清晰的,使用的是MVC构架
MVC中各个角色对应的组件为:
M:Model,即模型,对应JavaBean
V:View,即视图,对应JSP页面
C:Controller,即控制器,对应Servlet。
本文参考自 轻量级JavaEE企业应用实战(第4版)——Struts 2+ Spring 4+Hibernate 整合开发 李刚 编著