- MVC基本原理
- 一个简单的例子
- 改良的例子
- Struts基本流程的实现
最近在学SSH(Struts+ Hibernate+Spring),这也算是一个比较经典的框架了,之前都是看人家大牛说这个框架,那个框架,说的真溜,自己也是佩服的五体投地啊~~
现在开始自己也要捣鼓捣鼓这些东西,还是有点小激动哒~~,Struts是基于MVC框架实现的,今天主要讲讲Struts的实现过程。
MVC基本原理
MVC框架,相信大家也都已经耳熟蓝(能)翔(详)了!
- 1、终端接受到用户的请求,然后转发给Controller进行处理。
- 2、控制器接收到用户的请求后,确认采用什么样的业务逻辑来处理该请求,并将该请求转给相应的业务请求来进行处理。
- 3、模型中包含处理该用户请求的所有业务组件,并且也执行用户所需要的全部数据存取,代表终端用户查询检索出的任何数据都被打包返回给控制器。
- 4、控制器在经过业务的处理之后确定去调哪一个视图,并将处理后的数据传到视图上去,显示视图给用户。
一个简单的例子
不灵活的Servlet的实现:
package com.bjpowernode.servlet;import java.io.IOException;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String requestURI= request.getRequestURI();System.out.print("requestURI"+requestURI);String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));System.out.println("path="+path);//获取界面的用户名String username=request.getParameter("username");UserManager userManger=new UserManager();String forward="";//通过截取url来判断执行的是什么方法if("/servlet/delUser".equals(path)){userManger.del(username);//页面跳转forward="/del_success.jsp";}else if("/servlet/addUser".equals(path)){userManger.add(username);//页面跳转forward="/add_success.jsp";}else if("/servlet/modifyUser".equals(path)){userManger.modify(username);//页面跳转forward="/modify_success.jsp";}else if("/servlet/queryUser".equals(path)){List userList=userManger.query(username);request.setAttribute("userList", userList);//页面跳转forward="/query_success.jsp";}else{throw new RuntimeException("请求失败!");}//统一进行跳转request.getRequestDispatcher(forward).forward(request,response);}@Override protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><display-name></display-name><servlet><servlet-name>TestServlet</servlet-name><servlet-class>com.bjpowernode.servlet.TestServlet</servlet-class></servlet><!-- 具体怎么访问 --><servlet-mapping><servlet-name>TestServlet</servlet-name><!-- <url-pattern>/servlet/TestServlet</url-pattern> --><url-pattern>*.action</url-pattern></servlet-mapping> <welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>
当用户发送请求时,比如:(http://localhost:8080/test_servlet/servlet/queryUser.action),然后根据有一定特点的URL来访问相应的Servlet。
在上边的例子中的配置文件可以看出,URL连接的尾部为*.action
,当用户访问该连接的时候,就会截取相应的URL段(servlet/…),然后根据截取的这一段来进行判断和页面转向。
看上边的代码明显的可以看出其中的缺陷,代码中有大量的if…else语句,不稳定,如果说想要添加新的连接的时候,就要在不断的添加新的if…else语句,还有就是在页面跳转的时候,如果页面的名称换掉了,那么还要手动的去代码中修改,我的天哪,真是太麻烦了!
改良的例子
由于if…else语句太多,造成一定的不稳定,在这基础上抽出一个接口,然后把具体的业务的实现封装到单独的类里面,:
具体的实现代码如下:
@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String requestURI= request.getRequestURI();System.out.print("requestURI"+requestURI);String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));System.out.println("path="+path);Action action=null;//通过截取url来判断执行的是什么方法if("/servlet/delUser".equals(path)){action=new DelUserAction();}else if("/servlet/addUser".equals(path)){action=new AddUserAction(); }else if("/servlet/modifyUser".equals(path)){action=new ModifyUserAction(); }else if("/servlet/queryUser".equals(path)){action=new QueryUserAction(); }else{throw new RuntimeException("请求失败!");}String forward=null;try{forward=action.execute(request, response);}catch(Exception e){e.printStackTrace();}//进行统一转向request.getRequestDispatcher(forward).forward(request, response);}
经过以上的改良,这个已经算是一个基本的MVC的实现了,有专门的前台UI界面,Servlet负责URL的截取,业务的处理以及页面的转向。对功能的实现进行了很好的分离,从而来保证其稳定性和扩展性。
时序图如下:
Struts基本流程的实现
下面来说一说Struts的基本流程是怎么实现的,也就是MVC的基本流程,和上面的时序图类似:
- 1、web客户端发送请求给Servlet(要遵守一定的规则)
- 2、Servlet截取URL,读取配置文件(struts-config.xml)中的这次请求相关的Action
- 3、然后去调用相应的Action,分发(dispatch)
- 4、调用模型层,获取相应的数据,并返回给Servlet
- 5、转向,跳转到相应的jsp界面
- 6、渲染页面,返回给客户显示
流程如下:
源码打包下载:JSP+Servlet讲解MVC实现原理
JSP+Servlet讲解MVC实现原理(改良版)