初次接触Struts,感觉类似于SSH框架之类的技术都很高大上。现在的商业市场上,太多的Web应用和网站采用SSH框架,不可否认,SSH框架之所以广为流传的一点就是,它的包装性很强,使用者只需在它提供的容器之中调用相应借口,并进行配置就可以搭建出各种高大上的网站。对于任何一个Struts框架初学者来说,多余接触惯了Java Web的MVC模式的应用开发,Struts显得并不陌生,也不困难。简而言之,Struts是对MVC模式的一种封装,一种打包,从而让使用者更容易的使用这种技术。
开门见山,先展示一个Struts框架上的实例:第一个Struts 1.x 实例 —— HelloWorld
新建项目,命名为HelloWorld;
右键,Myeclipse,Project Facets ,为新项目添加Strus1.3容器环境;
右键,new, Others,Myeclipse ,Web Struts 1.x ,新建Struts Form,Action & JSP;
按照指示添加helloForm, hello.jsp, helloAction;
注:图14.5:在Forward选项下添加一个Name为 success,Path为“/form/helloSuccess.jsp"的选项。Path必须以”/“开头,helloSuccess.jsp为HelloAction的输出页面。
添加成功后,可以查看到hello.jsp如下:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title>JSP for HelloForm form</title>
</head>
<body>
<html:form action="/hello">
name : <html:text property="name"/><html:errors property="name"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
编辑helloSuccess.jsp如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'helloSuccess.jsp' starting page</title>
</head>
<body>
Hello,${ helloForm.name }.Welcome to Struts world.
</body>
</html>
HelloForm如下:
package com.zlg.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class HelloForm extends ActionForm {
private static final long serialVersionUID = 1L;
private String name;
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
return null;
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
// TODO Auto-generated method stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
HelloForm相当于一个java Bean,它把表单封装成一个JavaBean对象,有利于数据的存储和传输。
web.xml如下:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</servlet>
struts-config.xml如下:
从这个视图中,可以看得出,Struts的大体工作流程即:
hello.jsp提交表单——>表单信息封装到HelloForm中——>经过Struts内部机制的控制——>携带表单信息跳转到helloSuccess.jsp
具体这个过程中,Struts采用的是何种机制来控制应用程序的工作呢?
可以看到struts-config.xml的源码如下:
<struts-config>
<form-beans >
<form-bean name="helloForm" type="com.zlg.struts.form.HelloForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="helloForm"
input="/form/hello.jsp"
name="helloForm"
path="/hello"
scope="request"
type="com.zlg.struts.action.HelloAction"
validate="false"
cancellable="true">
<forward name="success" path="/form/helloSucess.jsp" />
</action>
</action-mappings>
<message-resources parameter="com.zlg.struts.ApplicationResources" />
</struts-config>
完成HelloAction代码,如下:
package com.zlg.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.zlg.struts.form.HelloForm;
public class HelloAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
HelloForm helloForm = (HelloForm) form;
if(helloForm.getName() == null || helloForm.getName().trim().length() == 0){
return mapping.getInputForward();
}
return mapping.findForward("success");
}
}
到这里,第一个struts 1.x实例可以说已经完成了。运行,如下:
运行结果为:
若输入中文,会出现乱码,可以加入字符过滤器Filter,如下:
package com.zlg.struts.core;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
private boolean enable;
private String character;
public void init(FilterConfig config) throws ServletException {
character = config.getInitParameter("character") ;
enable = config.getInitParameter("enable").trim().equalsIgnoreCase("true");
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
if(enable==true && (character != null || !character.equals(""))){
req.setCharacterEncoding(character);
resp.setCharacterEncoding(character);
}
chain.doFilter(req, resp);
}
public void destroy() {
character=null;
}
}
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.zlg.struts.core.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>enable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>character</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
从上面的实例可以看出,struts的工作流程如下: