Stripes,同Struts一样,是一种展示层的框架。一般在项目中作应用层使用。它的核心接口是ActionBean,类似于Spring中的Controller,实现该接口后,你就可以编写event,调用相应的业务逻辑进行处理。
<body>
<h1>Hello World!</h1>
<div>${actionBean.message}</div>
</body>
首先我们以一个简单的HelloWorld项目来了解一下Stripes的流程以及部分配置文件:
目标:当在页面上点击“welcome”按钮后,跳转至另一页面并显示输入信息。
Stripes的入口是filter,
StripesFilter 同时会过滤所有的 JSP 文件和 DispatcherServlet。
如果请求的是一个
jsp 页面,在 StripesFilter 处理完后会直接跳转到相应的JSP页面。如果请
求是一个 ActionBean 的某个 event ,后续处理工作会交给 DispatcherServlet 来进行。
StripesFilter 主要是为请求处理作一些准备工作,它负责读取配置,处理 Locale
,并根据页面的 form 取得相应的 ServletWrapper 包装类。
你需要在web.xml中配置StripesFilter,详细代码如下:
<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.thoughtworks.stripes</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>StripesFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<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>
Stripes定义了自己的标签,index.jsp代码如下:
<body>
<stripes:form beanclass="com.thoughtworks.stripes.HelloActionBean" method="post">
<div>
<stripes:text name="message"/>
</div>
<div>
<stripes:submit name="sayHello" value="Welcome"/>
</div>
</stripes:form>
</body>
<stripes:form beanclass="com.thoughtworks.stripes.HelloActionBean" method="post">
<div>
<stripes:text name="message"/>
</div>
<div>
<stripes:submit name="sayHello" value="Welcome"/>
</div>
</stripes:form>
</body>
beanclass属性定义由哪一个ActionBean来处理这个form。在点击welcome按钮后,Stripes将beanclass值根据自己的规则生成特定的url,在此项目中为:Hello.action。在Stripes:sumbit的name属性来定义由哪个event handler来处理,在此项目中为sayHello方法。
Filter经过过滤和简单处理后,将控制权移交给DispatcherServlet(拦截*.action),DispatcherServlet根据url来生成HelloActionBean的对象,HttpServletRequest将要传递的参数绑定到ActionBean上(必须添加getter和setter方法),根据form提交按钮的 name属性来判断需要哪一个handler来处理该event。
HelloActionBean中代码如下:
public class HelloActionBean implements ActionBean {
private static final String GREETPAGE = "/WEB-INF/page/greeting.jsp";
private String message;
private ActionBeanContext context;
public void setContext(ActionBeanContext context) {
this.context = context;
}
public ActionBeanContext getContext() {
return context;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Resolution sayHello(){
return new ForwardResolution(GREETPAGE);
}
}
在sayHello方法处理后,返回一个Resolution对象。
Resolution 提供了 HttpServletRequest 和 HttpServletResponse 的访问能力。
Stripes 提供了几种 Resolution 实现,ForwardResolution ,RedirectResolution,
StreamingResolution,ErrorResolution。
比较常用的是ForwardResolution和RedirectResolution。ForwardResolution
最终调用RequestDispatcher的forward方法显
示目标页面。而RedirectResolution
调用 HttpServletResponse的
sendRedirect方法显示目标页面。这两者之间的区别于Servlet中forward和redirect相同,本质是前者url与之前页面url一样,后者则发生改变。
在本项目中是使用了ForwardResolution来处理的。关于要跳转的页面,我们需要注意它自动添加的前缀是项目名\src\main\webapp,所以如果要跳转的页面与当前页面处于同一等级,可直接填写相对路径。否则,建议写绝对路径名。
在跳转到的greeting.jsp页面中,我们需要获取message的值,详细代码如下:
<h1>Hello World!</h1>
<div>${actionBean.message}</div>
</body>
我们可以根据创建的actionBean对象来获取message的值。如果有多个actionBean,Stripes会自动查找到对应的actionBean。范围为scope。
通过上述事例后,应该对Stripes的工作流程有了大致的了解,接下来我们需要学习Stripes自带的ajax的数据验证功能。谢谢!