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. 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="actions/Hello.action">forward风格测试</a></h3>  
 <h3> <a href="hellos">Servlet风格测试</a></h3>  
 <h3> <a href="helloworld/boonya-test-rest">Rest风格的测试</a></h3>  
</body>  
</html>

Hello.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>Hello-page</title>  
    <body>  
        Hello ${actionBean.name}  
        <br />  
        <br />  
        <stripes:link beanclass="com.boonya.stripes.actions.HelloActionBean">  
            <stripes:param name="name" value="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. <%@ 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="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="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

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

时间: 2024-08-28 16:52:04

Stripes视图框架实现ActionBean视图访问的相关文章

Stripes视图框架简介

Stripes第一次接触就觉得它很神奇,不禁让喜欢编码的程序员产生好奇心.是什么让他做到了灵活自如的进行页面跳转呢? Stripes是一个视图框架用于利用最新的Java技术来构建Web应用程序.它具有以下特点: 不需要对每一action进行映射配置(ActionBeans将自动被发现,它利用注释进行配置).支持:action转发.servlet请求.Rest风格请求. 强大的绑定引擎用于构建复杂并脱离请求参数(request parameter)的web对象. 易于使用并可本地化的验证与类型转换

Stripes视图框架Java对象属性验证和prototype.js Ajax的测试

Stripes视图框架Java对象属性验证,它允许对字段设置是否必须填写,对数字大小进行限制等.我用prototype.js Ajax 将验证后的数据及时地展示出来,下面来看程序. 1.编写User实体类 此用户共三个属性: name.email.age. package com.boonya.stripes.entity;      public class User {              private String name;              private String

Stripes视图框架内置Spring集成的使用

Stripes视图框架内置Spring集成了的,在项目中也遇到需要导入spring支持的jar包,这足以证明Stripes与Spring有着非同寻常的关系. Spring注入Java Bean 我们需要将Spring beans或业务对象自动地注入到需要进行处理或引用的对象上.在Stripes框架中,实现这一点并不要求外部配置-除了你的Spring上下文配置之外.上下文配置如下: <context:component-scan  base-package="com.boonya.strip

Stripes视图框架实现纯Java代码控制表现层参考文档

Stripes是一个开放源码的Web应用程序框架的基础上的模型 - 视图 - 控制器(MVC)模式.它的目的是通过使用Java技术,如在Java 1.5.x或以上版本中引入,实现"约定优于配置"的注解和泛型,它比Struts2框架更轻量.Stripes强调一组简单的约定整个框架的想法,减少配置的开销.在实践中,这意味着几乎没有Stripes的应用程序需要的任何配置文件,从而降低开发和维护工作. 1.Stripes特性 行动基于MVC框架 没有配置文件 POJO的 注解取代XML配置文件

ThinkPHP框架视图详细介绍 View 视图--模板(九)

原文:ThinkPHP框架视图详细介绍 View 视图--模板(九) 视图也是ThinkPHP使用的核心部分: 一.模板的使用 a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl) -->更换模板文件的后缀名(修改配置文件) 'TMPL_TEMPLATE_SUFFIX'=>'.tpl',//更改模板文件后缀名,默认是html b.修改模板文件目录层次 Tpl/Index/index.ht

Android视图框架

Android视图框架 Android的UI系统是android应用系统框架最核心,最基础的内容! 1. Android视图系统.层次关系 Android应用设计和Web应用设计类似,也分前端和后端设计.Android的核心要素和四大组件属于后端设计部分,UI设计属于前端设计.前端设计决定了用户体验的好坏,后端设计则决定了功能的完备和应用的安全.稳定. 对Android的UI设计来说,用到的最重要的两个类是:View和ViewGroup.它们决定着展示给用户的外观界面的形状.下面介绍下Andro

CI框架篇之视图篇--载入(1)

创建视图 创建视图文件很简单,只需要建立后缀名为'.php'的文件, 然后保存文件到 application/views/ 文件夹即可 当然,随着工程的大小,你有必要对很多的视图根据控制器进行归类, 然后分不同的文件夹存储: 例如: application/views/home   表示定义的前台主视图 application/views/admin   表示定义的后台主视图 载入视图 一个视图就是一个网页,或是网页的部分,如头部,底部,侧边栏等等.事实上,如果你需要 这种层次类型,视图可以很灵

【Win 10 应用开发】UI Composition 札记(一):视图框架的实现

在开始今天的内容之前,老周先说一个问题,这个问题记得以前有人提过的. 设置 Windows.ApplicationModel.Core.CoreApplicationView.TitleBar.ExtendViewIntoTitleBar 属性可以让应用窗口中的内容扩展到标题栏.简单地说,就是你的UI区域可以扩大,并填充到标题栏,这在开发自定义标题栏或弄个什么毛玻璃效果时很有用. 不过,这个 ExtendViewIntoTitleBar 属性有个“八阿哥”,一旦你设置之后,系统会对其进行记录,很

Django框架 之 view视图

浏览目录 概述 简单的视图 HttpRequest对象 CBV和FBV 给视图加装饰器 Request对象 Response对象 JsonResponse对象 Django shortcut functions 一.概述 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项