一. struts2的产生

struts1的缺点:
                         1. ActionForm过多,而且这个ActionForm在很大程度上又和VO(POJO)重复
                         2. 为了解决ActionForm过多的问题,使用了验证框架,但是配置复杂,因为是后期的产物
                         3. 与Spring的整合开发难度太大,配置过多
struts1之所以有这些问题,是因为在struts1产生的年代之中没有将POJO的概念提到一个重要的领域上来。但是与struts1同时产生的MVC设计框架(JSF、WebWork)开始逐步解决了这些问题,而其中仅次于struts1框架的就是WebWork,WebWork解决了所有Struts1的所有问题,而且使用起来更加简单,但是Struts1已经成为了行业的标准,名气比WebWork大,所以WebWork的发展比较难。后来Apache组织发现了WebWork的优点,就将其收为自己的一个子项目,利用这个子项目推出了一个新的框架——Struts2.0。因为在最早的Struts2.0之中,基本上就是将<webwork>节点更换成了<struts>节点,除此之外没有任何的变化,甚至连核心包Xwork.jar都是一样的,所以struts2=struts1的名气+WebWork的易用性

二. struts2的工作流程

1.struts 1.x的工作流程
struts 1.x所有的请求以".do"的形式发送到ActionServlet之中,之后由ActionServlet根据struts-config配置文件指定的操作找到对应的Action及ActionForm,默认调用ActionForm中的validate()方法,之后如果此方法返回null或者ActionErrors的集合中没有任何内容,则表示一切正确,如果有错误了,则跳转到struts-config文件中配置的input路径进行跳转,并通过<html error>进行错误显示,如果没有错误则继续交给Action执行。

2. struts 2.x的工作流程
从代码的角度来讲struts 2.x的代码更加简单,因为ActionForm没有了,而且配置也不麻烦了。
从工作流程上来讲,由于 struts 2.x配置的操作是一个过滤器:StrutsPrepareAndExecuteFilter,现在所有的请求肯定先找到过滤器上(struts 2.1之后过滤器有两种:StrutsPrepareFilter和StrutsExecuteFilter),之后根据请求的操作从struts.xml文件之中取出配置的信息,调用ActionSupport的子类中的excute()方法,并根据<result>节点的路径进行跳转操作。

三、搭建struts2开发环境

1.在eclipse里面新建一个maven的web项目,名称为TestStruts2,参考文章:http://www.cnblogs.com/NieXiaoHui/p/5990570.html

struts2系列(一):struts2入门(struts2的产生、struts2的工作流程、搭建struts2开发环境)-LMLPHP

2.引入struts2的相关依赖,见pom.xml

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>TestStruts2</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>TestStruts2 Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency> <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.15</version>
</dependency>
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>2.7.3</version>
</dependency>
<!--struts2的核心配置文件 begin -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.struts.xwork</groupId>
<artifactId>xwork-core</artifactId>
<version>2.2.1</version>
</dependency>
<!--struts2的核心配置文件 end -->
</dependencies>
<build>
<finalName>TestStruts2</finalName>
</build>
</project>

3.在src/main/java目录下新建一个struts2的主配置文件struts.xml和一个struts-user.xml配置文件,在struts.xml里面引入struts-user.xml,配置内容如下

struts.xml:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<include file="struts_user.xml" />
</struts>

struts-user.xml:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default"> </package> </struts>

4.web.xml里面引入struts2的过滤器StrutsPrepareAndExecuteFilter

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <!--struts2的核心过滤器,所有的请求都先到这里,之后根据请求的操作从struts.xml文件之中取出配置的信息,
调用ActionSupport的子类中的excute()方法 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

5. 在src/main/java新建一个包com.study.struts2.demo,在里面编写一个HelloWorldAction.java,在struts-user.xml里面配置这个action

HelloWorldAction.java:

 package com.study.struts2.demo;

 import com.opensymphony.xwork2.ActionSupport;

 public class HelloWorldAction extends ActionSupport {

     /**
*
*/
private static final long serialVersionUID = 6522825387249101847L; private String msg; @Override
public void validate() {
if (msg == null || "".equals(msg)) {
super.addFieldError("msg", "信息不能为空"); }
} @Override
public String execute() throws Exception { // 通过request取得jsp的内置对象
// this.msg="hellowrold123";
return SUCCESS;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} }

struts-user.xml:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" /> <package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result name="success">index.jsp</result>
</action> <action name="hello" class="com.study.struts2.demo.HelloWorldAction"
method="execute">
<result name="success">index.jsp</result>
<result name="input">index.jsp</result>
</action> </package> </struts>

6.编写index.jsp

 <%@ page language="java" pageEncoding="UTF-8"%>
<!--引入struts2的标签 -->
<%@ taglib prefix="s" uri="/struts-tags"%>
<body>
<p>
<a href="<s:url action='hello'/>">Hello World</a>
</p> <!--struts2的取值标签 value="<s:property value="msg" />"输入正确的被保留 -->
<form action="hello.action">
信息:<input type="text" name="msg" value="<s:property value="msg" />" />
<s:property value="fieldErrors['msg'][0]" />
<br> <input type="submit" value="提交">
</form> <!--验证通过后显示 -->
<h2>
<s:property value="msg" />
</h2>
</body>
</html>

经过上面的几步struts2的开发环境已经搭建完成,下面在tomcat里面启动项目,在浏览器输入地址http://localhost:8080/TestStruts2访问验证

struts2系列(一):struts2入门(struts2的产生、struts2的工作流程、搭建struts2开发环境)-LMLPHP

04-26 00:58