首页 > 代码库 > Stripes视图框架实现ActionBean视图访问

Stripes视图框架实现ActionBean视图访问

 Stripes最基本的实现是类似于Struts的请求,但没有Struts那么配置繁琐。下面就来看看怎样实现一个web应用的Action访问操作。本篇博文为设计Stripes的三种访问方式:普通Action的映射访问、类Servlet访问方式、Rest变参访问方式。前几天还没将Stripes应用示例打通,今天又本着不解决问题死不罢休的精神继续去弄,终于搞明白了。

1、编写Stripes的web.xml配置文件

 该文件定义了第三方的工具包、过滤器类、以及映射关系和访问格式;在此配置文件中有两种Stripes的配置(特定模板的Action过滤配置和动态URL路径配置),它们互不排斥,相互包容,方便了用户不同业务需求下的访问模式。其配置内容如下:


<?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"  
    version="2.5">  
      
    <!-- 如果没使用到,此内容可以不添加 -->  
    <context-param>  
        <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>  
        <param-value>StripesResources</param-value>  
    </context-param>  
      
    <!-- 基本ActionBean访问过滤配置 -->  
    <filter>  
        <display-name>Stripes Filter</display-name>  
        <filter-name>StripesFilter</filter-name>  
        <filter-class>net.sourceforge.stripes.controller.StripesFilter</filter-class>  
        <init-param>  
            <param-name>ActionResolver.Packages</param-name>  
            <param-value>com.boonya.stripes.actions</param-value>  
        </init-param>  
        <init-param>  
            <param-name>Interceptor.Classes</param-name>  
            <param-value>  
                net.sourceforge.stripes.integration.spring.SpringInterceptor  
            </param-value>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>StripesFilter</filter-name>  
        <servlet-name>StripesDispatcher</servlet-name>  
        <dispatcher>REQUEST</dispatcher>  
    </filter-mapping>  
      
    <servlet>  
        <servlet-name>StripesDispatcher</servlet-name>  
        <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>StripesDispatcher</servlet-name>  
        <url-pattern>*.action</url-pattern>  
    </servlet-mapping>  
      
    <!-- 动态配置隐射过滤器 -->  
  <filter>  
      <description>Dynamically maps URLs to ActionBeans.</description>  
      <display-name>Stripes Dynamic Mapping Filter</display-name>  
      <filter-name>DynamicMappingFilter</filter-name>  
      <filter-class>  
          net.sourceforge.stripes.controller.DynamicMappingFilter  
      </filter-class>  
      <init-param>  
          <param-name>ActionResolver.Packages</param-name>  
          <param-value>com.boonya.stripes.actions</param-value>  
      </init-param>  
  </filter>  
    
  <filter-mapping>  
      <filter-name>DynamicMappingFilter</filter-name>  
      <url-pattern>/*</url-pattern>  
      <dispatcher>REQUEST</dispatcher>  
      <dispatcher>FORWARD</dispatcher>  
      <dispatcher>INCLUDE</dispatcher>  
  </filter-mapping>  
   
   <!-- 欢迎界面 -->  
    <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
    </welcome-file-list>  
  
</web-app>

2、导入需要的jar包到项目WEB-INF的lib目录下

此处需要加入的jar包,由于Stripes实现的时候用到了springframework的jar包,所以需要在项目中添加,否则在访问页面时会有异常产生。示例项目目录结构如下图:



注:上面所示的Jar有个别不需要,如果需要使用Spring整合建议保留;另外,根目录下下还需要一个消息配置文件StripesResources.properties,缺少它在数据验证的时候无法处理消息信息。

3、编写抽象的ActionBean,AbstractActionBean

因为在每个ActionBean中都使用到了上下文对象设置,这部分属于公共行为,所以将其抽象出来。


  1.  

  2. package com.boonya.stripes.actions;  
      
    import java.io.Serializable;  
      
    import net.sourceforge.stripes.action.ActionBean;  
    import net.sourceforge.stripes.action.ActionBeanContext;  
    import net.sourceforge.stripes.action.SimpleMessage;  
      
    public abstract class AbstractActionBean implements ActionBean, Serializable {  
      
      private static final long serialVersionUID = -1767714708233127983L;  
      
      protected static final String ERROR = "/WEB-INF/Error.jsp";  
      
      protected transient ActionBeanContext context;  
      
      protected void setMessage(String value) {  
        context.getMessages().add(new SimpleMessage(value));  
      }  
        
      public ActionBeanContext getContext() {  
        return context;  
      }  
      
      public void setContext(ActionBeanContext context) {  
        this.context = context;  
      }  
      
    }

注:系统中公用的页面也可以设置在这里,应为这是所有对象的基本行为方式和处理逻辑。


4、编写业务需要的ActionBean

方式一:基本Action映射访问


  1. package com.boonya.stripes.actions;  
      
    import net.sourceforge.stripes.action.DefaultHandler;  
    import net.sourceforge.stripes.action.ForwardResolution;  
    import net.sourceforge.stripes.action.HandlesEvent;  
    import net.sourceforge.stripes.action.SessionScope;  
      
    @SessionScope  
    public class HelloActionBean extends AbstractActionBean {  
      
        private static final long serialVersionUID = -8946154817549504368L;  
          
        protected static final String HELLO ="/WEB-INF/Hello.jsp";  
          
        protected static final String BLOG ="/WEB-INF/Blog.jsp";  
        // 传递到指定的页面的参数  
        private String name="boonya-only-hellos";  
      
        public void setName(String name) {  
            this.name = name;  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        /** 
         * 默认跳转页面(@DefaultHandler) 
         * @return 
         */  
        @DefaultHandler  
        public ForwardResolution view() {  
            return new ForwardResolution(HELLO);  
        }  
          
        /** 
         * 指定跳转页面(@HandlesEvent)处理,可以不添加该注解 
         * @return 
         */  
        @HandlesEvent("viewToBlog")  
        public ForwardResolution viewToBlog() {  
            this.name=this.getClass().getName();  
            return new ForwardResolution(BLOG);  
        }  
      
    }


方式二:类Servlet访问方式


  1. package com.boonya.stripes.actions;  
      
    import net.sourceforge.stripes.action.ActionBeanContext;  
    import net.sourceforge.stripes.action.DefaultHandler;  
    import net.sourceforge.stripes.action.ForwardResolution;  
    import net.sourceforge.stripes.action.HandlesEvent;  
    import net.sourceforge.stripes.action.UrlBinding;  
    // URL 隐射路径  
    @UrlBinding("/hellos")  
    public class WorldActionBean  extends AbstractActionBean {  
          
        private static final long serialVersionUID = 3073270783412011577L;  
      
        protected static final String WORLD ="/WEB-INF/World.jsp";  
          
        protected static final String BLOG ="/WEB-INF/Blog.jsp";  
      
        // 传递到指定的页面的参数  
        private String name="boonya-page";  
          
        protected transient ActionBeanContext context;  
          
        @Override  
        public ActionBeanContext getContext() {  
                return context;  
        }  
         @Override  
        public void setContext(ActionBeanContext context) {  
                this.context = context;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        /** 
         * 默认跳转页面(@DefaultHandler) 
         * @return 
         */  
        @DefaultHandler  
        public ForwardResolution view() {  
            return new ForwardResolution(WORLD);  
        }  
          
        /** 
         * 指定跳转页面(@HandlesEvent)处理,可以不添加该注解 
         * @return 
         */  
        @HandlesEvent("viewToBlog")  
        public ForwardResolution viewToBlog() {  
            this.name=this.getClass().getName();  
            return new ForwardResolution(BLOG);  
        }  
      
    }


方式三:Rest风格变参访问


  1. package com.boonya.stripes.actions;  
      
    import net.sourceforge.stripes.action.DefaultHandler;  
    import net.sourceforge.stripes.action.ForwardResolution;  
    import net.sourceforge.stripes.action.HandlesEvent;  
    import net.sourceforge.stripes.action.UrlBinding;  
    // URL 隐射路径  
    @UrlBinding("/helloworld/{name}")  
    public class HelloWorldActionBean  extends AbstractActionBean {  
          
        private static final long serialVersionUID = 2276458379123668500L;  
      
        protected static final String WORLD ="/WEB-INF/HelloWorld.jsp";  
          
        protected static final String BLOG ="/WEB-INF/Blog.jsp";  
      
        // 传递到指定的页面的参数  
        private String name;  
      
        public void setName(String name) {  
            this.name = name;  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        /** 
         * 默认跳转页面(@DefaultHandler) 
         * @return 
         */  
        @DefaultHandler  
        public ForwardResolution view() {  
            return new ForwardResolution(WORLD);  
        }  
          
        /** 
         * 指定跳转页面(@HandlesEvent)处理,可以不添加该注解 
         * @return 
         */  
        @HandlesEvent("viewToBlog")  
        public ForwardResolution viewToBlog() {  
            this.name=this.getClass().getName();  
            return new ForwardResolution(BLOG);  
        }  
      
    }


5、编写测试JSP页面

index.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title>  
<style type="text/css">  
   body{  
      text-decoration: underline;  
      color: blue;  
      font-size: 12px;  
      font-family: ‘仿宋体‘;  
   }  
</style>  
</head>  
<body>  
 <h3> <a href="http://www.mamicode.com/actions/Hello.action">forward风格测试</a></h3>  
 <h3> <a href="http://www.mamicode.com/hellos">Servlet风格测试</a></h3>  
 <h3> <a href="http://www.mamicode.com/helloworld/boonya-test-rest">Rest风格的测试</a></h3>  
</body>  
</html>

Hello.jsp


  1.   

  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>  
    <%@ taglib prefix="stripes"  
        uri="http://stripes.sourceforge.net/stripes.tld"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <title>Hello-page</title>  
    <body>  
        Hello ${actionBean.name}  
        <br />  
        <br />  
        <stripes:link beanclass="com.boonya.stripes.actions.HelloActionBean">  
            <stripes:param name="name" value="http://www.mamicode.com/boonya-hello" />Try again</stripes:link>  
        <br>  
        <stripes:link beanclass="com.boonya.stripes.actions.HelloActionBean" event="viewToBlog">  
        from Hello-page to visit boonya‘s blog  
        </stripes:link>  
        <br>  
    </body>  
    </html>

World.jsp



  1.  

  2. <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>  
    <%@ taglib prefix="stripes"  
        uri="http://stripes.sourceforge.net/stripes.tld"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <title>World-page</title>  
    <body>  
        Hello ${actionBean.name}  
        <br />  
        <br />  
        <stripes:link beanclass="com.boonya.stripes.actions.WorldActionBean">  
            <stripes:param name="name" value="http://www.mamicode.com/boonya-world" />Try again</stripes:link>  
        <br>  
        <stripes:link beanclass="com.boonya.stripes.actions.WorldActionBean" event="viewToBlog">  
        from World-page to visit boonya‘s blog  
        </stripes:link>  
        <br>  
    </body>  
    </html>

HelloWorld.jsp



  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>  
    <%@ taglib prefix="stripes"  
        uri="http://stripes.sourceforge.net/stripes.tld"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <title>HelloWorld-page</title>  
    <body>  
        Hello ${actionBean.name}  
        <br />  
        <br />  
        <stripes:link beanclass="com.boonya.stripes.actions.HelloWorldActionBean">  
            <stripes:param name="name" value="http://www.mamicode.com/boonya-world" />Try again</stripes:link>  
        <br>  
        <stripes:link beanclass="com.boonya.stripes.actions.HelloWorldActionBean" event="viewToBlog">  
        from HelloWorld-page to visit boonya‘s blog  
        </stripes:link>  
        <br>  
    </body>  
    </html>

Blog.jsp



  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    <title>Blog-Page</title>  
    </head>  
    <body>  
     <h3>welcome to  boonya‘s blog.</h3>  
       
     <h2 style="color: blue;">from action‘s class name: <font color="red">${actionBean.name}</font> </h2>  
    </body>  
    </html>

Error.jsp没什么特别的内容故不在此处写出。


6、项目部署测试访问

以下是测试访问的效果图:

系统首页显示:


forward显示:



servlet显示:



rest显示:



示例程序下载地址:http://download.csdn.net/detail/boonya/6506145