本文共 4765 字,大约阅读时间需要 15 分钟。
最近在学SSH(Struts+ Hibernate+Spring),这也算是一个比较经典的框架了,之前都是看人家大牛说这个框架,那个框架,说的真溜,自己也是佩服的五体投地啊~~
现在开始自己也要捣鼓捣鼓这些东西,还是有点小激动哒~~,Struts是基于MVC框架实现的,今天主要讲讲Struts的实现过程。
MVC框架,相信大家也都已经耳熟蓝(能)翔(详)了!
不灵活的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 { @Override protected 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); }}
配置文件:
TestServlet com.bjpowernode.servlet.TestServlet TestServlet *.action index.jsp
当用户发送请求时,比如:(),然后根据有一定特点的URL来访问相应的Servlet。
在上边的例子中的配置文件可以看出,URL连接的尾部为*.action
,当用户访问该连接的时候,就会截取相应的URL段(servlet/…),然后根据截取的这一段来进行判断和页面转向。 看上边的代码明显的可以看出其中的缺陷,代码中有大量的if…else语句,不稳定,如果说想要添加新的连接的时候,就要在不断的添加新的if…else语句,还有就是在页面跳转的时候,如果页面的名称换掉了,那么还要手动的去代码中修改,我的天哪,真是太麻烦了! 由于if…else语句太多,造成一定的不稳定,在这基础上抽出一个接口,然后把具体的业务的实现封装到单独的类里面,:
具体的实现代码如下:
@Override protected 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的基本流程是怎么实现的,也就是MVC的基本流程,和上面的时序图类似:
流程如下:
源码打包下载: