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

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

2、Action对象工厂类实现:

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

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

3、Action接口类定义:

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

  1. package cn.netjava.action;
  2. public interface Action {
  3. /**
  4. * 所有的具体Action实现这个接口
  5. * @param request 请求对象
  6. * @param response 应答对象
  7. * @return :结果页面
  8. */
  9. public String execute(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response);
  10. }

4、web.xml中配置请求发送给控制器Servlet

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

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

  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类实现(即对登录动作进行处理的类)

  1. package cn.netjava.action;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. public class LoginAction implements Action {
  5. public String execute(HttpServletRequest request,
  6. HttpServletResponse response) {
  7. // 得到用户名和密码
  8. String userName = request.getParameter("userName");
  9. String userPwd = request.getParameter("userPwd");
  10. if (userName.equals("netjava") && userPwd.equals("netjava")) {
  11. request.setAttribute("userName", userName);
  12. return "main.jsp";
  13. } else {
  14. return "login.jsp";
  15. }
  16. }
  17. }

如果登录成功,跳转到 main.jsp页面,否则,返回login,jsp页面

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

main.jsp

  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

  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://blog.csdn.net/liupeng900605/article/details/6985344

JSP+Servlet+JavaBean的更多相关文章

  1. JSP+Servlet+javabean+oracle实现页面多条件模糊查询

    之前写过一篇JSP+Servlet+javabean+mysql实现页面多条件模糊查询 使用的是mysql进行的分页查询,mysql用limit控制,而oracle则是用rownum,今天第一次写or ...

  2. JSP中使用的模式——JSP+Servlet+JavaBean

    上一篇博文写到模式一:JSP+JavaBean 链接地址:http://wxmimperio.coding.io/?p=155 JSP中两种模式的总结 链接地址:http://wxmimperio.c ...

  3. MVC jsp+servlet+javabean 连接Mysql数据库測试demo

    本文介绍的是怎样使用MVC架构去实现jsp+servlet+javabean连接数据库 首先我们应该了解什么是MVC: MVC包含三个部分 : ①View:由各种JSP页面组成. ②Controlle ...

  4. 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...

  5. jsp+servlet+javabean开发web项目

    一.介绍: 项目依赖包:jdbc数据库包 jsp+servlet+javabean开发web项目,是最接近web项目原生运行原理的. 但是,jsp内容混乱,项目结构复杂时,代码会混乱 二.运行原理: ...

  6. Jsp+Servlet+JavaBean经典MVC模式理解

    MVC模式目的(实现Web系统的职能分工). 在Java EE中,Jsp+Servlet+JavaBean算是里面经典的模式,是初学者必备的知识技能.M, Model(模型)实现系统的业务逻辑 1.通 ...

  7. (jsp+servlet+javabean )MVC架构

    MVC是三个单词的缩写,这三个单词分别为:模型.视图和控制. 使用的MVC的目的:在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.比如Windows系统资源管理器文件夹内容的显示方 ...

  8. JSP+Servlet+javabean+mysql实现页面多条件模糊查询

    需求: 一般列表页上面会有一个查询框,有各种的查询条件组合,一般都采用模糊查询方式 ,以下以自己做的实例来说明一下实现方法: 需要实现的界面原型:要满足条件: 1.单选分类,点GO按扭 2.单独输入标 ...

  9. jsp+servlet+javaBean+Dao

    一.Servlet程序各模块介绍1.JSP 用于显示.收集数据的部分.2.Servlet 用于验证数据.实例化JavaBean.调用DAO连接数据库.控制页面跳转3.DAO 用于连接数据库及进行数据库 ...

随机推荐

  1. linux shell中的 #!/bin/bash

    #!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径. bash只是shell的一种,还有很多其它shell,如:sh ...

  2. Mysql查询优化器

    Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...

  3. 解决WebSphere异常:SRVE0199E: 已获取了 OutputStream

    dlg: 例如 在WebSphere这个目录下 /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/temp/master1Node01/master1/gk ...

  4. Oracle数据库“Specified cast is农田valid”

    这种错误是笔者在执行一条计算符合条件的行有多少个,用OracleDataReader读取计算出的行数时发生. 查询语句为: Select Count(1) FROM HP_TS Where TS_ID ...

  5. selenium-grid2 远程并发控制用例执行

    今天闲来无事,随意看了一下selenium,突然注意到grid这个功能以前都是,在读有关selenium的文档时候知道有这么个grid远程控制的功能,但一直没有去试过.所以呢,今天就简单的做了这么个小 ...

  6. <转+改>Web测试中关于登录的测试

    请问,你为自己写过的用例怀疑过吗? 前两天听一个朋友说他同事写了100个用例,结果有92个是无效的,差点被公司开了,本人以前也写过不少用例,但现在忽然怀疑我的用例了,觉得越来越糊涂了,拿登陆框来说吧, ...

  7. 3 years in Tencent game

    心里一直有继续写博文的愿望,却一直被各种借口打断,现在回头一看,已经在腾讯待了3年半之久.3年半是个比较尴尬的时间点,不好意思说自己是游戏从业老兵,但又觉得自己对于行业已经看到比较清楚了:从当年毕业时 ...

  8. nohub命令

    http://jingyan.baidu.com/article/335530daa4707f19cb41c3ef.html

  9. 理解KMP

    KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法.简单匹配算法的时间复杂度为O(m*n),KMP匹配算法,可以证明它的时间复杂度为O(m+n).. 一.简单匹配算法 先来看一个 ...

  10. 精美&创意的WordPress新发主题集合

    今天我整理了一些精美&创意的WordPress新发主题,它们基本上都融合了最新的设计理念,从简约到响应式,应有尽有. Engo – Smart & Minimal WordPress ...