Session:用来记录会话的状态对象
ServletContext和application:用来封装应用程序的配置信息
JSP的开发模式——MVC设计模式
MVC(模型-视图-控制器)是20世纪80年代为Smalltalk-80编程语言发明的一种软件设计模式,它是一种分离业务逻辑与显示界面的设计方法。
MVC的模型(Model)部分负责管理程序的业务数据,视图(View)部分负责显示界面,控制器(Controller)部分则负责与用户进行交互(接受请求和选择响应视图)。
JSP规范给出了使用JSP页面构建Web应用程序的两个方案—JSP模式1和模式2。两个模式的区别在于处理的位置。
JSP模型1(JSP+JavaBean):JSP页面负责处理请求并将响应发送给客户端
JSP部分:既包含输出效果的html+css代码,又包含业务逻辑的Java代码
JavaBean部分:封装对数据库的操作代码和部分的业务逻辑代码
Model1的典型的交换过程:首先用户通过浏览器调用Web应用中的JSP页面,发送request请求,JSP页面接收到浏览器的请求后,通过调用JavaBean对象的方法从数据库中读取数据,然后JSP页面再把数据返回浏览器,最终在浏览器中显示相应的信息。
优点:非常适合小型Web项目的快速开发;对JavaWeb开发人员的技术要求不高。
弊端:Java和HTML柔和在一起,在Web项目开发的后期和维护阶段会造成很大的困难。
JSP模型2(MVC):模型2体系结构集成使用了Servlet和JSP页面,在该模型中,JSP页面用于表示层,并且Servlet负责处理各类任务。
Servlet作为一个控制器,负责处理请求并创建JSP页面所需的任何Bean。该控制器也负责确定将该请求传递到哪个JSP页面。JSP页面检索Servlet创建的对象,并提取动态内容插入在一个模板中。
Servlet部分:处理各种请求的分派
JavaBean部分:对数据库的操作
JSP部分:数据的最终显示
Model2交互过程:首先用户通过浏览器向Web应用中的Servlet发送请求,Servlet接收到请求后实例化JavaBean对象,调用JavaBean对象的方法,JavaBean对象返回从数据库中读取的数据,Servlet选择合适的JSP,并且把从数据库中读取的数据通过这个JSP进行显示,最后JSP页面把最终的结果返回给浏览器。
优点:业务逻辑和表示内容得到了很好的分离,这种开发方式适合多人合作开发大型的项目。
弊端:Web项目开发的难度加大了,对开发人员的技术要求也提高了。
Servlet作为一个控制器,负责处理请求并创建JSP页面所需的任何Bean,该控制器也负责确定将该请求传递到哪个JSP页面。JSP页面检索Servlet创建的对象,并提取动态内容插入在一个模板中。
在WEB应用中很难实现模型的“状态改变通知”事件,视图不能随着模型的改变而自动更新。在web应用中无法完全实现真正意义上的mvc模型,模式2只能算是mvc设计模式的一种变体,有人干脆将他称之为“webMVC”.
注意:在MVC设计模式中,View用来呈现数据处理结果,可以是JSP、XML、HTML;Model用来存储数据的状态,可利用JavaBean来实现;Controller负责协调应用程序的运行流程,可用Servlet来实现。运用这种模式可以将数据呈现方式和数据处理方式分离,提高了代码的利用率。这种模式也是最常用的基本开发模式之一
Servlet可以充当控制器角色,也可以实现控制器角色。
实例一:用模型一实现用户登录功能
login.jsp部分
<%
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 (
//基本语法格式的验证:用户名是不是空格或者密码长度是否在6-10个字符之间
if (loginForm.validate()) {
//验证用户名和密码是否是合法的
DbUtil util = DbUtil.getInstance();
UserBean user = util.getUser(loginForm.getName());
if (user == null) {
loginForm.setErrorMsg("name", "用户名不存在");
} else {
if (user.validatePassord(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>
loginSuccess.jsp部分
<%--
显示用户详细信息
--%>
<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>
DbUtil.java部分
//存储从数据库中提取的用户信息
private Hashtable users=new Hashtable();
static DbUtil instance=new DbUtil();
private DbUtil(){
UserBean user1=new UserBean();
user1.setName("张三");
user1.setPassword("1234567");
user1.setEmail("zhangsan@163.com");
UserBean user2=new UserBean();
user2.setName("里斯");
user2.setPassword("1234567");
user2.setEmail("lisi@163.com");
UserBean user3=new UserBean();
user3.setName("万古");
user3.setPassword("1234567");
user3.setEmail("wang@163.com");
users.put(user1.getName(), user1);
users.put(user2.getName(), user2);
users.put(user3.getName(), user3);
}
public static DbUtil getInstance(){
return instance;
}
public UserBean getUser(String name){
UserBean user=(UserBean) users.get(name);
return user;
}
LoginFormBean.java部分
private String name;
private String password;
//errors对象存储所有错误消息
private Hashtable errors=new Hashtable();
public StringgetName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//验证用户输入的密码是否有效,语法格式验证
public boolean validate(){
boolean allOk=true;
if(name.trim().equals("")){
errors.put("name", "输入的用户名不能为空,请输入你的用户名");
allOk=false;
}
if(password.length()>10 || password.length()<6){
errors.put("password","密码必须在6-10位之间,请重新输入");
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;
}
UserBean.java部分
private String name;
private String password;
private String 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;
}
//验证方法
public boolean validatePassord(String password){
if(this.password.equals(password)){
return true;
}else{
return false;
}
}