`
vtrtbb
  • 浏览: 360040 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jsp + javabean + servlet写的MVC

    博客分类:
  • java
阅读更多

首先设置 web.xml 让所有请求扩展名为.do 的都通过ControllerFilter.java来解析

<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
    id="WebApp_ID" version="2.5">  
    <display-name>mvc</display-name>  
  
    <filter>  
        <filter-name>controllerFilter</filter-name>  
        <filter-class>com.mvc.cms.ControllerFilter</filter-class>  
        <init-param>  
            <param-name>ERROR_PAGE</param-name>  
            <param-value>error.jsp</param-value>  
        </init-param>  
           
        <init-param>  
            <param-name>OBJECT_NAME</param-name>  
            <param-value>loginBean</param-value>  
        </init-param>  
    </filter>    
  
    <filter-mapping>  
        <filter-name>controllerFilter</filter-name>  
        <url-pattern>*.do</url-pattern>  
    </filter-mapping>  
  
    <welcome-file-list>  
        <welcome-file>index.html</welcome-file>  
        <welcome-file>index.htm</welcome-file>  
        <welcome-file>index.jsp</welcome-file>  
        <welcome-file>default.html</welcome-file>  
        <welcome-file>default.htm</welcome-file>  
        <welcome-file>default.jsp</welcome-file>  
    </welcome-file-list>  
</web-app>  


 

 

ControllerFilter.java 控制器

 

public class ControllerFilter implements Filter {   
  
    protected FilterConfig filterConfig;   
    private final Map<String,String> map = new HashMap<String,String>();   
       
    public void init(FilterConfig config) {   
        this.filterConfig = config;   
        String filePath = config.getServletContext().getRealPath("/WEB-INF/web-config.xml");   
        DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();   
        try {   
            DocumentBuilder builder = dbfactory.newDocumentBuilder();   
            InputStream in = new FileInputStream(filePath);   
            Document doc = builder.parse(in);          
            Element root = doc.getDocumentElement();   
            NodeList list = root.getElementsByTagName("action");   
            for (int i = 0; i < list.getLength(); i++) {   
                Element element = (Element) list.item(i);   
                NodeList nameValue = element.getElementsByTagName("name");   
                Element nameElement = (Element) nameValue.item(0);   
                String clazzName = nameElement.getFirstChild().getNodeValue();   
                   
                NodeList clazz= element.getElementsByTagName("clazz");   
                Element clazzElement = (Element) clazz.item(0);   
                String  clazzValue = clazzElement.getFirstChild().getNodeValue();   
                map.put(clazzName, clazzValue);   
            }              
        } catch (SAXException e) {   
            e.printStackTrace();   
        } catch (IOException e) {   
            e.printStackTrace();   
        } catch (ParserConfigurationException e) {   
            e.printStackTrace();   
        }    
    }   
  
    public void destroy() {   
        this.filterConfig = null;   
    }   
  
    public void doFilter(ServletRequest srequest, ServletResponse sresponse,FilterChain filterChain) throws IOException, ServletException {   
        HttpServletRequest request = (HttpServletRequest) srequest;   
        HttpServletResponse response = (HttpServletResponse) sresponse;   
        //验证不通过进行跳转   
        /*if (!passed(request,response)) {  
            String errorPage=this.filterConfig.getInitParameter("ERROR_PAGE");  
            response.sendRedirect(errorPage);  
            return;  
        }*/  
        request.setCharacterEncoding("GBK");   
        String path = (String) request.getRequestURI();   
        String actionString = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf("."));   
        String forwardPage = null;   
        Action actionClazz = null;   
        if (map.containsKey(actionString)) {   
            String clazz = map.get(actionString);   
            actionClazz = getAction(clazz);   
            try {                  
                forwardPage = actionClazz.execute(request, response);   
            } catch (ActionException e) {   
                e.printStackTrace();   
            }   
        }   
        if (forwardPage != null) {   
            filterConfig.getServletContext().getRequestDispatcher(forwardPage).forward(request, response);   
        }   
    }   
       
    //验证权限   
    private boolean passed(ServletRequest request, ServletResponse response)  throws IOException, ServletException {   
        boolean result=false;   
        return result;   
    }   
       
    private Action getAction (String clazz) {   
        ActionFactory factory = ActionFactory.getInstance();   
        return factory.getAction(clazz);   
    }  


 

 

设置一个web-config.xml 来表示某个请求对应的类

<?xml version="1.0" encoding="UTF-8"?>  
<struts>  
    <action>  
        <name>login</name>  
        <clazz>com.mvc.cms.action.testAction</clazz>  
    </action>    
    <action>  
        <name>login2</name>  
        <clazz>com.mvc.cms.action.LoginAction</clazz>  
    </action>    
    <action>  
        <name>login3</name>  
        <clazz>com.mvc.cms.action.testAction3</clazz>  
    </action>    
</struts> 

 

 

写一个接口action

public interface Action {   
       
    /**  
     * excute a certain function  
     * @param request  
     * @param response  
     */  
    public String execute(HttpServletRequest request, HttpServletResponse response)  throws IOException, ServletException,ActionException;   
}  

 

 

让所有的action都实现这个接口,如:

public class LoginAction implements Action {   
  
    @Override  
    public String execute(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException,ActionException {   
        String userName = request.getParameter("userName");   
        if (userName != null) {   
            request.setAttribute("userName", userName);   
            return "/UI/ok.jsp";   
        }else{   
            return "/UI/login.jsp";   
        }   
    }   
  
}  

 

 

一个类工厂,用到了反射

public class ActionFactory {   
    private static final Map<String, Object> factory = new HashMap<String, Object>();   
    private static ActionFactory actionFacory;   
  
    private ActionFactory() {   
  
    }   
  
    public synchronized  static ActionFactory getInstance() {   
        if (actionFacory == null) {   
            actionFacory = new ActionFactory();   
        }   
        return actionFacory;   
    }   
  
    @SuppressWarnings("unchecked")   
    public Action getAction(String clazz) {   
        final String key = clazz;   
        if (!factory.containsKey(key)) {   
            try {   
                Constructor c = Class.forName(clazz).getDeclaredConstructor(new Class[] {});   
                c.setAccessible(true);   
                factory.put(key, c.newInstance(new Object[] {}));   
            } catch (Exception ex) {   
                throw new ExceptionInInitializerError(ex);   
            }   
        }   
        return (Action) factory.get(key);   
    }   
  
}  


 

 

自己胡乱写的,呵呵

分享到:
评论
8 楼 mercyblitz 2010-03-14  
asialee 写道
mercyblitz 写道
asialee 写道
解析XML配置文件用的是dom解析,这个在文件大的情况下很占内存,struts1使用的是digester进行解析的吧,lz可以考虑一下SAX解析。



要考虑场景,解析配置文件会消耗多大的内存呢,SAX太复杂了,不适合LZ。


配置文件有时候会很大的,而且配置主要是读取,用SAX最合适。


配置文件能有多大?启动之后就GC掉了!
7 楼 bocar 2010-03-14  
fenxue 写道
String actionString = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf("."));
这句话感觉有问题, path.lastIndexOf(".")不能用在这里,后面传递的参数namevalue
中也可能包含"."符号,可以用".do截取"

楼主用"."截取没有错,但是需要对path做去冗余的处理,去除"?"之后的东东,或者通过request.getServletPath()获得path,因为servlet中我们不一定非要用.do做匹配,也可以是其他的标识。
6 楼 fenxue 2010-03-13  
String actionString = path.substring(path.lastIndexOf("/") + 1, path.lastIndexOf("."));
这句话感觉有问题, path.lastIndexOf(".")不能用在这里,后面传递的参数namevalue
中也可能包含"."符号,可以用".do截取"
5 楼 bocar 2010-03-13  
建议楼主将 Action execute()的返回值用ActionForward封装一下,因为不仅仅是 forward 的情况,还有 redirect 的情况,且并且可以为Ajax JSON做准备。
4 楼 asialee 2010-03-13  
mercyblitz 写道
asialee 写道
解析XML配置文件用的是dom解析,这个在文件大的情况下很占内存,struts1使用的是digester进行解析的吧,lz可以考虑一下SAX解析。



要考虑场景,解析配置文件会消耗多大的内存呢,SAX太复杂了,不适合LZ。


配置文件有时候会很大的,而且配置主要是读取,用SAX最合适。
3 楼 mercyblitz 2010-03-13  
asialee 写道
解析XML配置文件用的是dom解析,这个在文件大的情况下很占内存,struts1使用的是digester进行解析的吧,lz可以考虑一下SAX解析。



要考虑场景,解析配置文件会消耗多大的内存呢,SAX太复杂了,不适合LZ。
2 楼 asialee 2010-03-13  
解析XML配置文件用的是dom解析,这个在文件大的情况下很占内存,struts1使用的是digester进行解析的吧,lz可以考虑一下SAX解析。
1 楼 xiaolongfeixiang 2010-03-12  
<p><span style="font-size: small;">似乎和Struts1.x相似度极高....</span></p>
<p><span style="font-size: small;"><br></span></p>
<p><span style="font-size: small;">思维不要被束缚了。 加油!!继续努力!!</span></p>

相关推荐

    Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统

    Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统 Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统 Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统

    JSP+JavaBean+Servlet技术(MVC模型)

    JSP+JavaBean+Servlet技术(MVC模型) JSP+JavaBean+Servlet技术(MVC模型) JSP+JavaBean+Servlet技术(MVC模型) JSP+JavaBean+Servlet技术(MVC模型) JSP+JavaBean+Servlet技术(MVC模型) JSP+JavaBean+Servlet...

    jsp+servlet+javaBean实现MVC

    jsp+servlet+javaBean实现MVC jsp+servlet+javaBean实现MVC jsp+servlet+javaBean实现MVC jsp+servlet+javaBean实现MVC

    jsp+javabean+servlet实现登录注册以及留言板

    jsp+javabean+servlet使用简单的MVC模式实现登录注册、留言板、分页的功能。model(javabean)层实现读写数据库,数据库名为webapp,没有密码;view(JSP)实现展示信息;controller(servlet)层联系model和view,...

    jsp+JavaBean+Servlet+MySQL宿舍管理系统(初学者)

    【标题】"jsp+JavaBean+Servlet+MySQL宿舍管理系统(初学者)"是一个针对初学者设计的项目,旨在帮助他们理解并实践Web应用开发的基本技术。这个系统的核心是使用JSP(JavaServer Pages)来展示界面,JavaBean作为业务...

    JSP源码——jsp+servlet+javaBean实现MVC_jspmvc.zip

    【JSP源码——jsp+servlet+javaBean实现MVC】是基于Java Web技术构建的一种经典MVC(Model-View-Controller)模式的应用实例。在Web开发中,MVC模式被广泛采用,它将应用程序的业务逻辑、数据处理和用户界面分离,...

    JSP+JavaBean+Servlet网上书店

    通过这个项目,开发者可以掌握JSP、JavaBean和Servlet的综合运用,了解如何构建一个完整的Web应用,并熟悉数据库管理和MVC设计模式。同时,该项目也提供了实践用户交互、数据处理和后端服务的好机会,对于提升Web...

    Jsp+Servlet+JavaBean 实现MVC模式的留言本

    Jsp+Servlet+JavaBean 实现MVC模式的留言本 声明:本留言本所有源代码开源,使用者可以自由修改和传播,但仅限于非商业用途。 作者:梁龙 博客:http://www.lianglong.net.cn 由于这是本人学习JAVA的第一个项目,...

    jsp+servlet+javaBean实现MVC-jspmvc.zip

    jsp+servlet+javaBean实现MVC_jspmvcjsp+servlet+javaBean实现MVC_jspmvcjsp+servlet+javaBean实现MVC_jspmvcjsp+servlet+javaBean实现MVC_jspmvcjsp+servlet+javaBean实现MVC_jspmvcjsp+servlet+javaBean实现MVC_...

    其他类别jsp+servlet+javaBean实现MVC-jspmvc

    [其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+...

    (Servlet+JSP+JavaBean实现)用户注册和登陆

    Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP、JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此...

    jsp+servlet+javaBean实现MVC源码

    jsp+servlet+javaBean实现MVC源码 jsp+servlet+javaBean实现MVC源码 jsp+servlet+javaBean实现MVC源码 jsp+servlet+javaBean实现MVC源码 jsp+servlet+javaBean实现MVC源码 jsp+servlet+javaBean实现MVC源码 jsp+...

    jsp+servlet+javaBean实现MVC_jspmvc(毕业设计+课程设计)

    jsp+servlet+javaBean实现MVC_jspmvc(毕业设计+课程设计)jsp+servlet+javaBean实现MVC_jspmvc(毕业设计+课程设计)jsp+servlet+javaBean实现MVC_jspmvc(毕业设计+课程设计)jsp+servlet+javaBean实现MVC_jspmvc...

    其他类别jsp+servlet+javaBean实现MVC-jspmvc.rar

    [其他类别]jsp+servlet+javaBean实现MVC_jspmvc.rar[其他类别]jsp+servlet+javaBean实现MVC_jspmvc.rar[其他类别]jsp+servlet+javaBean实现MVC_jspmvc.rar[其他类别]jsp+servlet+javaBean实现MVC_jspmvc.rar[其他...

    jsp+servlet+javabean+ajax MVC模式,增删改查,数据分页显示

    本文将深入探讨`JSP(JavaServer Pages)、Servlet、JavaBean`以及`Ajax`如何在MVC架构下实现数据的增删改查与分页显示,并涉及`SmartUpload`组件用于文件和图片的上传。 首先,`MVC`模式是一种软件设计模式,它将...

    [其他类别]jsp+servlet+javaBean实现MVC_jspmvc.zip

    [其他类别]jsp+servlet+javaBean实现MVC_jspmvc [其他类别]jsp+servlet+...[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+javaBean实现MVC_jspmvc

    基于JSP+JavaBean+Servlet模式的图书管理系统的研究和实现

    《基于JSP+JavaBean+Servlet模式的图书管理系统的研究与实现》 图书管理系统是信息化建设中的重要组成部分,它能够高效地管理和检索图书信息,为图书馆的日常运营提供便利。本项目采用经典的JSP(JavaServer Pages...

Global site tag (gtag.js) - Google Analytics