JSP的开发模式和设计模式(MVC)和实例—注册

  • Post author:
  • Post category:其他



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>

密&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/

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类的一个实例