本项目基于MVC架构来设计模型,MVC包括3个基本部分,分别是Model(模型),View(视图)和Controller(控制器)。JSP只负责显示表单内容,下面给出MVC模型下的流程图:
在MVC模型下,JSP的功能被简化了,使用了Servlet来充当控制器,而不是在JSP里面就设定了逻辑业务模块,所以JSP只是负责显示结果的功能。如果按以前的Java Web编程设计,在JSP中进行接收参数和判断还有跳转等功能会使用到大量的Java代码,这样就会使得后期对页面的维护工作非常困难。然而,Servlet本身就是一个Java文件,这样使用Servlet来接收参数,逻辑判断和页面跳转等功能是非常合适的。
事实上,Servlet在MVC设计模型中,负责了所有的业务逻辑并且通过JavaBean来操作数据库,进行数据逻辑处理以及决定显示页面。
通过分层的思想,使得程序执行起来更加清晰,各层只是负责自己的功能,不会出现混乱的情况,而且如果后期的维护工作中需要对程序进行增加功能等都是个非常方便的,因此MVC模型非常适合在中小Jave Web项目中使用,下面通过一个经典的Java Web项目--登陆页面的验证来说明MVC设计模型。
本项目不连接数据库,因此在进行用户登陆时,默认用户名和密码都是:liuyanbing,该项目有三个JSP模块和一个java类以及一个Servlet模块。三个JSP模块包括:
<1>登陆页面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%>"> <title>My JSP 'login.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <h2>用户登录</h2> <form action="loginConfirm/WebRoot/login_conf.jsp" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="uname"></td> </tr> <tr> <td>密 码:</td> <td><input type="password" name="upassword"></td> </tr> <tr> <td colspan="2"> <input type="submit" value="登陆"> <input type="reset" value="重置"> </td> </tr> </table> </form> </center> </body> </html>
<2>登陆成功页面:login_success.jsp:该JSP用于用户登陆成功后显示信息,在该页面中添加了对request对象范围内login属性的判断,当该属性存在并且属性值为true时才能显示用户登陆成功,否则跳转到登陆页面。这是为了保证在Tomcat测试下,不会出现不经过登陆验证就可以直接跳转到登陆成功页面。代码如下:
<%@ 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%>"> <title>My JSP 'login_success.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <% if(request.getAttribute("login")!=null&&request.getAttribute("login").equals("true")){ %> <h2>登陆成功</h2> <% }else{ %> <jsp:forward page="login.jsp"></jsp:forward> <% } %> </center> </body> </html>
<3>登陆失败页面:login_failure.jsp,该页面用户当用户等登陆信息错误时跳转的页面。这里没有像登陆成功那样设置了request对象范围内的验证。代码如下:
<%@ 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%>"> <title>My JSP 'login_failure.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <center> <h2>登录失败</h2> </center> </body> </html>
<4>登陆信息获取类:LoginCheak.java,在Web项目下的src中新建了一个LoginCheck.java类,用于获取用户在登陆页面中输入的用户名和密码,并且对信息进行验证,将最后的结果以波尔型传递给登陆信息确认类(LogionConf.java)。代码如下:
public class LoginCheck { public boolean isLogin(String name,String password){ if("liuyanbing".equals(name)&&"liuyanbing".equals(password)){ return true; }else{ return false; } }
<5>登陆信息确认类:LogionConf.java。该类作为本项目的Servlet,成为整个项目的控制器,在该类中继承了HttpServlet类,重写了doGet()和doPost()两个方法,使用request对象和response对象对整个表单的请求进行验证,并返回相应操作的响应结果。代码如下:
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 LoginConf extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ String name=request.getParameter("uname"); String password=request.getParameter("upassword"); LoginCheck lc=new LoginCheck(); if(lc.isLogin(name, password)){ request.setAttribute("login", "true"); request.getRequestDispatcher("login_success.jsp").forward(request, response); }else{ request.getRequestDispatcher("login_failure.jsp").forward(request, response); } } public void doPost(HttpServletRequest request,HttpServletResponse response){ } }
编写好代码后,对项目进行部署,首先比如修改的就是WEB-INF目录下的web.xml,对Servlet进行配置,具体的配置信息如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" 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-app_2_4.xsd"> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>LoginConf</servlet-name> <servlet-class>LoginConf</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginConf</servlet-name> <url-pattern>/servlet/LoginConf</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
配置好Servlet信息后,启动Tomcat服务器,进行项目测试,具体测试如下: