JSP+Servlet+JavaBean

字体大小: 中小 标准 ->行高大小: 标准
MVC是三个单词的缩写:M,Model(模型);V,View( 视图 ),C,Control(控制)。

MVC模式的目的就是实现Web系统的职能分工,

Model层:实现系统的业务逻辑,即javaBean部分

View层:负责与用户交互,即在界面上展示数据对象给用户,即html,jsp

Control层:Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作,当然就是Servlet的职责了


下面我们用MVC设计模式来实现 简单的用户登录过程

1、控制器Servlet的实现

系统中只有一个servlet即ControlServlet,所有页面发起的以" *.do "的请求,都被web.xml配置给ControlServlet进行处理,在ControlServlet中根据‘ * ’的字符串(即解析用户请求的路径),调用ActionFactory生成的制定Action对象,在将处理后的URL转发给用户。

ControlServlet.java

Java代码 
1.package cn.netjava.servlet; 
2.
3.import java.io.IOException; 
4.import javax.servlet.ServletException; 
5.import javax.servlet.http.HttpServlet; 
6.import javax.servlet.http.HttpServletRequest; 
7.import javax.servlet.http.HttpServletResponse; 
8.
9.import cn.netjava.action.Action; 
10.import cn.netjava.action.ActionFactory; 
11.
12./** 
13.* Servlet implementation class ControlServlet 
14.*/ 
15.public class ControlServlet extends HttpServlet { 
16.private static final long serialVersionUID = 1L; 
17.
18.protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
19.//得到当前Servlet的请求路径 
20.String pathName =request.getServletPath(); 
21.// request.getContextPath();得到项目名字 
22.System.out.println("pathName:"+pathName); 
23.//得到请求的Action名字 
24.int index = pathName.indexOf("."); 
25.String ActionName = pathName.substring(1, index); 
26.System.out.println(ActionName); 
27.//获取运行时参数 
28.String ActionClassName = this.getInitParameter(ActionName); 
29.//得到Action对象 
30.Action action = ActionFactory.getActionFactory().getAction(ActionClassName); 
31.//执行Action的execute得到要返回的URL路径 
32.String url = action.execute(request, response); 
33.if(url==null){ 
34.request.getRequestDispatcher("error.jsp").forward(request, response); 
35.}else{ 
36.request.getRequestDispatcher(url).forward(request, response); 
37.} 
38.} 
39.
40.} 
2、Action对象工厂类实现:


ActionFactory是一个单实例类(整个系统只需要使用其一个对象),它只提供一个Action对象,通过getAction(String ActionClassName) 的方法调用创建一个Action对象。这个方法在Control中被调用。代码如下: 


Java代码 
1.package cn.netjava.action; 
2./** 
3.* 根据Action名字,创建Action对象 
4.* @author Administrator 
5.* 
6.*/ 
7.public class ActionFactory { 
8.
9.//单例模式:不需要创建对象 
10.private ActionFactory(){ 
11.} 
12.//单实例访问方法,得到ActionFactory对象 
13.public static ActionFactory getActionFactory(){ 
14.if(af == null){ 
15.af = new ActionFactory(); 
16.} 
17.return af; 
18.} 
19./** 
20.* 根据具体的Action类名字创建Action对象 
21.* @param ActionClassName :具体的Action类全名 
22.* @return:Action类型对象 
23.*/ 
24.public Action getAction(String ActionClassName){ 
25.Action action = null; 
26.try{ 
27.action = (Action) Class.forName(ActionClassName).newInstance(); 
28.}catch(Exception e){ 
29.e.printStackTrace(); 
30.} 
31.return action; 
32.} 
33.
34.private static ActionFactory af; 
35.
36.
37.} 
3、Action接口类定义:

所有的事件处理(即Action)类都必须实现这个接口

Java代码 
1.package cn.netjava.action; 
2.
3.public interface Action { 
4./** 
5.* 所有的具体Action实现这个接口 
6.* @param request 请求对象 
7.* @param response 应答对象 
8.* @return :结果页面 
9.*/ 
10.public String execute(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response); 
11.
12.} 
4、web.xml中配置请求发送给控制器Servlet


最后,我们只需要在wex.xml中对MVC结构的配置:

视图页面中的请求都是以<动作名字>.do结尾,当这个请求到达web服务器后,会被服务器转向给控制器处理,控制器在根据解析出的动作名,调用对应的Action对象,处理结果,并输出结果页面,所以web.xml中必须有如下配置:

Java代码 
1.<servlet> 
2.<servlet-name>controlServlet</servlet-name> 
3.<servlet-class>cn.netjava.servlet.ControlServlet</servlet-class> 
4.<init-param> 
5.<param-name>loginAction</param-name> 
6.<param-value>cn.netjava.action.LoginAction</param-value> 
7.</init-param> 
8.</servlet> 
9.<servlet-mapping> 
10.<servlet-name>controlServlet</servlet-name> 
11.<url-pattern>*.do</url-pattern> 
12.</servlet-mapping> 
4、具体的Action类实现(即对登录动作进行处理的类)


Java代码 
1.package cn.netjava.action; 
2.
3.import javax.servlet.http.HttpServletRequest; 
4.import javax.servlet.http.HttpServletResponse; 
5.
6.public class LoginAction implements Action { 
7.
8.public String execute(HttpServletRequest request, 
9.HttpServletResponse response) { 
10.// 得到用户名和密码 
11.String userName = request.getParameter("userName"); 
12.String userPwd = request.getParameter("userPwd"); 
13.if (userName.equals("netjava") && userPwd.equals("netjava")) { 
14.request.setAttribute("userName", userName); 
15.return "main.jsp"; 
16.} else { 
17.return "login.jsp"; 
18.} 
19.} 
20.
21.} 
如果登录成功,跳转到 main.jsp页面,否则,返回login,jsp页面


以下是main.jsp和login.jsp页面:

main.jsp

Html代码 
1.<%@ page language="java" contentType="text/html; charset=utf-8" 
2.pageEncoding="utf-8"%> 
3.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
4.<html> 
5.<head> 
6.<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
7.<title>Insert title here</title> 
8.</head> 
9.<body> 
10.<h1 style="color:red"><%=request.getAttribute("userName") %>登录成功</h1> 
11.</body> 
12.</html> 
login.jsp

Html代码 
1.<%@ page language="java" contentType="text/html; charset=utf-8" 
2.pageEncoding="utf-8"%> 
3.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
4.<html> 
5.<head> 
6.<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
7.<title>用户登录</title> 
8.</head> 
9.<body> 
10.<form action="loginAction.do" method="post"> 
11.用户名:<input type="text" name="userName" id="userName"><br> 
12.密码:<input type="password" name="userPwd" id="userPwd"><br> 
13.<input type="submit" value="登录"/> 
14.</form> 
15.</body> 
16.</html> 
最后做个总结吧:以前我们与服务器进行交互,可能jsp页面和servlet中都将html和java代码参杂在一起,这会导致系统的系统维护困难、分工不清;例如在加有jsp代码段的网页中,程序员与美工之间的配合就非常困难!MVC结构的系统会从根本上强制我们将web系统中的数据对象、业务逻辑、用户界面三者分离,使得程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/68770.html