struts2系列(一):struts2入门(struts2的产生、struts2的工作流程、搭建struts2开发环境)
一. 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
2.引入struts2的相关依赖,见pom.xml
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.study</groupId> 5 <artifactId>TestStruts2</artifactId> 6 <packaging>war</packaging> 7 <version>0.0.1-SNAPSHOT</version> 8 <name>TestStruts2 Maven Webapp</name> 9 <url>http://maven.apache.org</url> 10 <dependencies> 11 <dependency> 12 <groupId>commons-fileupload</groupId> 13 <artifactId>commons-fileupload</artifactId> 14 <version>1.2.1</version> 15 </dependency> 16 <dependency> 17 <groupId>commons-io</groupId> 18 <artifactId>commons-io</artifactId> 19 <version>1.3.2</version> 20 </dependency> 21 22 <dependency> 23 <groupId>commons-logging</groupId> 24 <artifactId>commons-logging-api</artifactId> 25 <version>1.1</version> 26 </dependency> 27 <dependency> 28 <groupId>org.freemarker</groupId> 29 <artifactId>freemarker</artifactId> 30 <version>2.3.15</version> 31 </dependency> 32 <dependency> 33 <groupId>ognl</groupId> 34 <artifactId>ognl</artifactId> 35 <version>2.7.3</version> 36 </dependency> 37 <!--struts2的核心配置文件 begin --> 38 <dependency> 39 <groupId>org.apache.struts</groupId> 40 <artifactId>struts2-core</artifactId> 41 <version>2.1.8.1</version> 42 </dependency> 43 <dependency> 44 <groupId>org.apache.struts.xwork</groupId> 45 <artifactId>xwork-core</artifactId> 46 <version>2.2.1</version> 47 </dependency> 48 <!--struts2的核心配置文件 end --> 49 </dependencies> 50 <build> 51 <finalName>TestStruts2</finalName> 52 </build> 53 </project>
3.在src/main/java目录下新建一个struts2的主配置文件struts.xml和一个struts-user.xml配置文件,在struts.xml里面引入struts-user.xml,配置内容如下
struts.xml:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 <include file="struts_user.xml" /> 8 </struts>
struts-user.xml:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 8 <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 9 <constant name="struts.devMode" value="false" /> 10 11 <package name="default" namespace="/" extends="struts-default"> 12 13 14 15 </package> 16 17 </struts>
4.web.xml里面引入struts2的过滤器StrutsPrepareAndExecuteFilter
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 7 <display-name></display-name> 8 <welcome-file-list> 9 <welcome-file>index.jsp</welcome-file> 10 </welcome-file-list> 11 12 <!--struts2的核心过滤器,所有的请求都先到这里,之后根据请求的操作从struts.xml文件之中取出配置的信息, 13 调用ActionSupport的子类中的excute()方法 --> 14 <filter> 15 <filter-name>struts2</filter-name> 16 <filter-class> 17 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 18 </filter-class> 19 </filter> 20 21 <filter-mapping> 22 <filter-name>struts2</filter-name> 23 <url-pattern>/*</url-pattern> 24 </filter-mapping> 25 26 </web-app>
5. 在src/main/java新建一个包com.study.struts2.demo,在里面编写一个HelloWorldAction.java,在struts-user.xml里面配置这个action
HelloWorldAction.java:
1 package com.study.struts2.demo; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class HelloWorldAction extends ActionSupport { 6 7 /** 8 * 9 */ 10 private static final long serialVersionUID = 6522825387249101847L; 11 12 private String msg; 13 14 @Override 15 public void validate() { 16 if (msg == null || "".equals(msg)) { 17 super.addFieldError("msg", "信息不能为空"); 18 19 } 20 } 21 22 @Override 23 public String execute() throws Exception { 24 25 // 通过request取得jsp的内置对象 26 // this.msg="hellowrold123"; 27 return SUCCESS; 28 } 29 30 public String getMsg() { 31 return msg; 32 } 33 34 public void setMsg(String msg) { 35 this.msg = msg; 36 } 37 38 }
struts-user.xml:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 6 <struts> 7 8 <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 9 <constant name="struts.devMode" value="false" /> 10 11 <package name="default" namespace="/" extends="struts-default"> 12 <default-action-ref name="index" /> 13 <action name="index"> 14 <result name="success">index.jsp</result> 15 </action> 16 17 <action name="hello" class="com.study.struts2.demo.HelloWorldAction" 18 method="execute"> 19 <result name="success">index.jsp</result> 20 <result name="input">index.jsp</result> 21 </action> 22 23 </package> 24 25 </struts>
6.编写index.jsp
1 <%@ page language="java" pageEncoding="UTF-8"%> 2 <!--引入struts2的标签 --> 3 <%@ taglib prefix="s" uri="/struts-tags"%> 4 <body> 5 <p> 6 <a href="<s:url action='hello'/>">Hello World</a> 7 </p> 8 9 <!--struts2的取值标签 value="<s:property value="msg" />"输入正确的被保留 --> 10 <form action="hello.action"> 11 信息:<input type="text" name="msg" value="<s:property value="msg" />" /> 12 <s:property value="fieldErrors['msg'][0]" /> 13 <br> <input type="submit" value="提交"> 14 </form> 15 16 <!--验证通过后显示 --> 17 <h2> 18 <s:property value="msg" /> 19 </h2> 20 </body> 21 </html>
经过上面的几步struts2的开发环境已经搭建完成,下面在tomcat里面启动项目,在浏览器输入地址http://localhost:8080/TestStruts2访问验证