JSP的开发模式和设计模式(MVC)

来源:互联网 发布:淘宝商城儿童女装 编辑:程序博客网 时间:2024/04/28 05:45


一   JSP的设计模式

1.MVC模式的概念:

(1)在开发一个软件之前,必须先设计好其架构,一个基本的架构思想是将软件分成不同的模块,问题的关键就是如何划分模块。

(2)MVC(模型-视图-控制器)是20世纪80年代为Smalltalk-80编程语言发明的一种软件设计模式,它是一种分离业务逻辑与显示界面的设计方法。

(3)MVC的模型(Model)部分负责管理程序的业务数据,视图(View)部分负责显示界面,控制器(Controller)部分则负责与用户进行交互(接受请求和选择响应视图)。

图示、:

二  JSP的开发模式

1.开发模式的介绍 

JSP规范给出了使用JSP页面构建Web应用程序的两个方案—JSP模式1和模式2两个模式的区别在于处理的位置。

2.两个开发模式的介绍:

(1)JSP模式1(JSP + JavaBean):在模式1的体系结构中,JSP页面负责处理请求并将响应发送给客户端。图示:

   

注:jsp既包含输出效果的html+css代码,又包含业务逻辑的Java代码

      JavaBean是封装对数据库的操作代码和部分的业务逻辑代码

模式1的运行流程:

    首先用户通过浏览器调用Web应用中的JSP页面,发送request请求,JSP页面接收到浏览器的请求后,通过调用JavaBean对象的方法从数据库中读取数据,然后JSP页面再把数据返回浏览器,最终在浏览器中显示相应的信息。

模式1的优点:

   非常适合小型Web项目的快速开发;对Java Web开发人员的技术要求不高。

模式1的弊端:

    Java和HTML柔和在一起,在Web项目开发的后期和维护阶段会造成很大的困难。

模式1的模式实例---用来实现用户登入,用到的是jsp和javaBean的设计:

实现思路---图示:

      

图解:

(1)logon.jsp为显示登录表单和处理登录请求的页面,登录成功后跳转到logonSuccess.jsp页面,登录失败时重新显示登录表单和失败的帮助信息,以便用户重新登录;如果已登录用户再次访问logon.jsp,login.jsp将请求转发给logonSuccess.jsp页面。

(2)LogonFormBean.java就是封装登录表单信息的JavaBean程序,它可以对各个属性(也就是登录表单内的各个字段中所填写的数据)进行语法格式方面的校验。

(3)UserBean.java为代表用户信息的JavaBean程序,logon.jsp页面根据登录信息从DbUtil对象中检索出相应的UserBean对象,logonSuccess.jsp页面从   UserBean对象中提取用户信息显示。

(4)DbUtil.java是用于访问数据库的辅助类,它相当于一个DAO(数据访问对象),这里用DbUtil类中封装的一个HashTable对象来代替数据库,HashTable对象中的每一个元素即为一个UserBean对象。

(5)UserBean中仅仅是定义了三个属性:name、password和email。注意:要存储在Session域中或跨JVM传输的JavaBean应实现Serializable接口

•    DbUtil类是一个单件类,在整个Web应用程序中只能创建DbUtil类的一个实例对象,在DbUtil类内部预存储了两个用户信息来模拟数据库中的用户记录。

•    LogonFormBean对其中的每个属性进行基本的格式验证,如果有误则将相应的错误信息保存到一个HashTable对象中,同时也定义了供JSP页面检索错误信息的 方法。

代码:

首先创建UserBean.java----表单的详细信息存储在userBeaan中

package com.csdn.beans;

public class UserBean {

    private String name;

    private String password;

    private String email;

    public UserBean() {

       super();

       // TODO Auto-generated constructor stub

    }

    public UserBean(String name, String password, String email) {

       super();

       this.name = name;

       this.password = password;

       this.email = email;

    }

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public String getPassword() {

       return password;

    }

    public void setPassword(String password) {

       this.password = password;

    }

    public String getEmail() {

       return email;

    }

    public void setEmail(String email) {

       this.email = email;

    }

    @Override

    public String toString() {

       return "UserBean [email=" + email + ", name=" + name + ", password="

              + password + "]";

    }

    //验证方法

    public boolean validatePassword(String password){

       if(this.password.equals(password)){

           return true;

       }else{

           return false;

       }

    }

创建LoginFormBean.java-----把表单中的信息封装到一个类中,验证输入的格式是否正确

package com.csdn.beans;

import java.util.Hashtable;

 

public class LoginFormBean {

    private String name;

    private String password;

    // 存储所有的错误消息,通过键值对存储

    private Hashtable errors = newHashtable();

 

    public LoginFormBean() {

       super();

       // TODO Auto-generated constructor stub

    }

 

    public LoginFormBean(String name, String password) {

       super();

       this.name = name;

       this.password = password;

    }

 

    public String getName() {

       return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    public String getPassword() {

       return password;

    }

 

    public void setPassword(String password) {

       this.password = password;

    }

 

    @Override

    public String toString() {

       return "LoginFormBean [name=" + name + ", password=" + password + "]";

    }

 

    // 验证用户输入的用户名和密码是否存在,是语法格式的验证

    public boolean validate() {

       boolean allOk = true;

       // trim()去掉两边的空串

 

       if (name.trim().equals("")) {

           errors.put("name", "用户名为空,请重新输入你的用户名");

 

           allOk = false;

       }

       if (password.length() > 10 || password.length() < 6) {

           errors.put("password", "密码不能为空,或密码的位数没有在指定的范围,请重新输入");

           allOk = false;

       }

       return allOk;

    }

 

    // 错误消息的插入

    public void setErrorMsg(String err, String errMsg) {

       if (err != null || errMsg !=null) {

           errors.put(err, errMsg);

       }

    }

 

    // 错误消息的设置

    public String getErrorMsg(String err) {

       String errMsg = (String) errors.get(err);

       return (errMsg == null) ? "" : errMsg;

    }

}

 

创建login.jsp 来对用户进行验证

    <%@ page language="java"

    import="java.util.*,com.csdn.beans.*,com.csdn.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/csshref="styles.css">

    -->

 

    </head>

 

    <body>

       <%

           request.setCharacterEncoding("utf-8");

       %>

       <!-- 在当前的会话范围内,如果用户已经登入,应该转向到loginSuccess.jsp -->

       <%

           if (session.getAttribute("user") != null) {

       %>

       <jsp:forward page="loginSuccess.jsp"></jsp:forward>

       <%

           }

       %>

 

       <!-- 用户信息的验证,用户的账号和密码应该封装在loginFormBean对象中,有基本的语法格式的验证,用户的名字和密码是否正确,如果不正确,跳转到当前的页面中来  -->

 

       <jsp:useBean id="loginForm" class="com.csdn.beans.LoginFormBean"

           scope="page"></jsp:useBean>

       <jsp:setProperty property="*" name="loginForm" />

       <!-- 条件判定 -->

       <%

           if (request.getParameter("submit") !=null) {

              //基本语法格式的验证,用户名是不是字符,是不是为空

              if (loginForm.validate()) {

                  //验证用户名和密码是否是合法的

                  DbUtil util = DbUtil.getInstance();

                  UserBean user = util.getUser(loginForm.getName());

                  if (user == null) {

                     loginForm.setErrorMsg("name", "用户名不存在");

                  } else {

                     if (user.validatePassword(loginForm.getPassword())) {

                         // 登入成功

                         session.setAttribute("user", user);

                         pageContext.forward("loginSuccess.jsp");

                     } else {

                         //用户名存在但是密码不对

                         loginForm.setErrorMsg("password", "密码错误!");

                     }

                  }

              }

           }

       %>

 

       <!-- 表单的显示 -->

       <form action="login.jsp" method="post">

           <table border="1px">

              <tr>

                  <td>

                     用户名

                  </td>

                  <td>

                     <input type="text" name="name" />

                  </td>

                  <td>

                     <%=loginForm.getErrorMsg("name") %>

                  </td>

               </tr>

              <tr>

                  <td>

                     密&nbsp;&nbsp;码

                  </td>

                  <td>

                     <input type="password" name="password" />

                  </td>

                  <td style="font-size:red;">

                     <%=loginForm.getErrorMsg("password") %>

                  </td>

              </tr>

              <tr>

                  <td>

                     <input type="submit" value="submit" name="submit" />

                  </td>

                  <td>

                     <input type="reset" value="reset" name="reset" />

                  </td>

                  <td></td>

              </tr>

           </table>

       </form>

    </body>

</html>

 

创建loginSuccess.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 'loginSuccess.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/csshref="styles.css">

    -->

 

  </head>

 

  <body>

    <!-- 显示用户的详细信息 -->

    <jsp:useBean id="user" class="com.csdn.beans.UserBean" scope="session"></jsp:useBean>

    <jsp:getProperty property="name" name="user"/><br/>

    <jsp:getProperty property="password" name="user"/><br/>

    <jsp:getProperty property="email" name="user"/><br/>

    <!-- 注销操作 -->

    <a href="login.jsp">注销用户</a>

  </body>

</html>

 

补充:

(1)设置和获取jsp中的初始化参数---用application对象

PageContext执行forword和include

ServiceContext application.setAttribute(“”,””);

String encoding = application.getInitParameter(“encoding”);

 

(2)Servlet对象

 Page对象提供对网页上定义的所有对象的访问,page对象表页面本身,他是java.lang.Object类的一个实例