JSP的开发模式和设计模式(MVC)
    
   
    
     一 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 =
    
     new
    
    
     Hashtable
    
    ();
   
    
     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/
    
     css
    
    ”
    
     href
    
    =”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>
密  码
</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/
    
     css
    
    ”
    
     href
    
    =”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类的一个实例
 
