一。架包的下载
2,新建项目导入jar架包。
新建一个web的项目,我们都能是实现。那么struts的jar包到底导入哪些呢?这里有一个简单的方法,在apps下有很多demo,找到第一个demo文件,struts2-blank.war这个项目,解压,完成后我们打开到lib下,把里面的jar包复制到我们项目的lib文件夹下。
二,新建一个helloword输入,通过struts2访问。
代码类:
package cn.ies.struts2;
public class HelloAction {
public String sys() {
System.out.println("hello----struts2");
return "hello";
}
}
.xml文件配置(文件名固定struts.xml位置固定src下)
我们可以直接在struts2-blank这个demo中找到struts.xml文件,将文件的copy到我们的项目的src目录下。
在struts标签下,添加如下代码
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="cn.ies.struts2.HelloAction" method="sys">
<result name="success">/hello.jsp</result>
</action>
</package>
在浏览器中输入http://localhost:8080/Struts2Demo/hello.action访问;
三,具体配置文件属性详解
1. struts的配置文件名struts.xml和位置src下是固定的
2.配置文件主要有三个标签package,action,result
3.标签package
类似于代码中的包,作用是为了区别不同的action。要配置action,必须先写package的标签
在package里面才能配置action。
标签属性
(1)name:name属性值必须唯一。一个配置文件中可以有多个package。
(2)extends:固定,值为struts-default,写了这个属性,在package的
配置的类才具有action的属性。
(3)namespace:属性空间,默认为“/”,与action的属性name构成访问路径。
例:namespace的值为/a,action的name值为hello,访问路径就是:http://locoalhost:8080/项目名/a/hello.action
4.标签action
action标签配置action的访问路径(浏览器怎么输入才能访问到我。)
标签属性
(1)name属性:namespace属性值和action的name属性值决定访问路径
在package中可以有多个action的属性,但是action的name属性不能相同
(2)class属性:
action的全路径(你要访问的类得文件路径)
(3)method属性:action的执行方法,默认访问为execute方法,但是可以method可以配置方法。
5.标签result
根据action的返回值,配置到不同的路径里面。
标签属性:
(1)name属性:匹配action的返回值,到不同的界面
(2)type属性:配置如何到页面中去(转发dispatcher或者重定向redirect)。
默认为转发操作。
6.修改常量属性:
(1)
通过配置修改默认常量问题
<constant name="struts.iln8.encoding" value="UTF-8"/>
(2)
-在src新建struts.properties,进行修改
-在web.xml中进行配置。
说明:这两种方式第二种基本不使用,不在举例。
struts.iln8.encoding=utf-8;
(1)表单提交数据到action里面,在action中可以获取表单提交的数据。
(2)表单提交数据中有中文,有乱码问题,解决。
-post直接设置编码
-get提交做编码转换
(3)如果再action的获取表单通过post的设置常量解决乱码问题
8.分模块开发
单独写一个配置文件,把配置文件引入到核心配置struts.xml文件中。
在我们实际的开发中,会出现不同的功能模块,便会出现不同功能的实现类,如果我们把我们所有用到的action的都配置在核心配置文件中,后期的软件维护会相当糟糕。所以引入了分模块开发的概念。所谓的分模块开发呢就是将不同的类的配置到同一类别的配置文件中,然后将配置文件引入到核心配置文件中。
例如,我们的有个HelloAction类和UserAction的类,两个类实现不同的功能,那么我们就可以新建两个xml文件,引入struts2的约束,配置两个类,在将配置文件通过<include file="cn/ies/form/form1.xml"></include>引入到struts.xml中。
9.访问action的方法(重点)
三种实现方式
(1)使用action标签的method的属性,在这个属性里面执行action的方法。
package cn.ies.struts2;
public class HelloAction {
public String sys() {
System.out.println(this.getClass().getName()+"----sys()");
return "sys";
}
public String show() {
System.out.println(this.getClass().getName()+"----show()");
return "show";
}
}
<!-- 配置方式1 -->
<package name="hello" namespace="/" extends="struts-default">
<action name="helloAction_sys" class="cn.ies.struts2.HelloAction" method="sys">
<result name="sys">/sys.jsp</result>
</action>
<action name="helloAction_show" class="cn.ies.struts2.HelloAction" method="show">
<result name="show">/show.jsp</result>
</action>
</package>
(2)使用通配符方式实现。<action name="hello_*" class="cn.ies.struts2.HelloAction" method="{1}">
package cn.ies.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
public String sys() {
System.out.println(this.getClass().getName()+"----sys()");
return "sys";
}
public String show() {
System.out.println(this.getClass().getName()+"----show()");
return "show";
}
}
<!-- 配置方式2 -->
<package name="test" extends="struts-default" namespace="/">
<action name="testAction_*" class="cn.ies.struts2.TestAction" method="{1}">
<result name="{1}">/{1}.jsp</result>
</action>
</package>
name中可以包含*,*代表匹配所有。method的值为{1}表示name中第一个*的值,当然name中可以有多个*。在本例中,testAction_*表示会匹配以testAction_开头的所有请求,然后请求类中的*的具体方法。当然结果集中也可以使用*匹配的方式。
(3)动态访问实现(基本不用)
<!-- 开启动态方法访问
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
-->
10.Result的type的属性:
(1)type属性:如何到界面上去;(转发还是重定向)
(2)type的属性值:
<1>默认值:做转发的操作,值为dispatcher
<action name="bookAction" class="cn.ies.struts2.BookAction">
<result name="success" type="dispatcher">/add.jsp</result>
</action>
package cn.ies.struts2;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class BookAction extends ActionSupport {
@Override
public String execute() throws Exception {
return "success";
}
}
特点:地址栏不会发生变化,只发送一次请求。
<2>重定向:redirect-----》两次请求
<action name="bookAction" class="cn.ies.struts2.BookAction">
<result name="success" type="redirect">/add.jsp</result>
</action>
特点:地址栏发生变化,发送两次请求。
--------------配置的其他action-----------------------<3>chain:转发到action,一般不用;缓存问题
<4>redirectAction:重定向到action
(3)和(4)这两种是针对action到action的情况,其中(3)代表的是转发,(4)代表重定向,(3)这种情况缓存比较难以处理,所以在开发中主要使用的是redirectAction这种。下面我们具体来演示一下。
package cn.ies.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class OrderAction extends ActionSupport {
@Override
public String execute() throws Exception {
return "success";
}
}
<action name="orderAction" class="cn.ies.struts2.OrderAction">
<result name ="success" type="redirectAction">/bookAction</result>
</action>
我们可以看出一共发送了三次请求,其中orderAction重定向bookAction一次。
11.全局结果界面和局部结果界面配置
(1)全局结果页面配置在package之内,action之外编写如下
<!-- 配置全局结果界面 -->
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
(2)局部结果界面配置,在action之内的result的就是局部结果界面配置。
(3)二者之间的关系:
当局部结果界面不能够匹配时,在匹配全局结果界面。
只有多个action的返回结果一致时,才能将结果定义为全局结果界面。