一、struts2简介
1.1 struts2是什么
struts2是一个web层的架构,初步实现了mvc的模式,使得网站开发变的更加的便捷。
如图所示:
1.2 struts2的优点
自动封装参数、参数校验、结果的处理(转发、重定向)、国际化、显示等待页面、表单的重复提交。
1.3 struts2的历史
struts2与structs1的区别就是没有任何关系,struts2前身是webwork框架,改名了,改成了struts2了,因为struts比较有名。
二、struts2框架搭建
2.1 导包
由于不知道导入哪些包,我们可以解压struts2的压缩包,找到里边的apps,里边有demo,我们打开一个最简单的demo,找到下边的lib里边的包就可以了
同样用360压缩打开,这是我们的war包
里边的lib的包赋值出来就行了。
2.2 编写Action类
struts2中的每一个请求都看做为一个Action,一个Action由一个Action类来处理。
package cn.itcast.action;
public class HelloAction {
public String hello(){
return "success";
}
}
2.3 编写配置文件struts.xml
在src下边创建一个名字为struts.xml的配置文件,这是struts2的核心配置文件。并导入约束:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="hello" namespace="/hellospace" extends="struts-default">
<action name="HelloAction" class="cn.itcast.action.HelloAction"
method="hello">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
2.3 配置struts2核心过滤器
struts2通过过滤器拦截请求,进入自己的框架内处理,所以要配置一下,在web.xml中加入以下配置。
<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>
2.4 添加index.jsp页面
添加一个index.jsp页面,请求之后要转发到index.jsp中,在里边写入一些内容。
浏览器访问 http://localhost:8080/strutsday01/hellospace/HelloAction 如果现实正常,说明配置成功。
三、配置详解
3.1 struts.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
package: 将Action封装配置在一起,构成一个包,区分一下一组有相似功能的Action
name:包名,起到标识作用,随便起,不能和其他包重复。
namespace:名称空间,访问其中所有action地址的前缀
extends:继承自那个包,一般写struts-default,当然也可以定义自己的包,包中已经封装了一些常见的功能,继承之后就不用重新配置了
<package name="hello" namespace="/hellospace" extends="struts-default">
action:配置一个Action类
name:action类的名称,访问action的时候要用这个名称,也不一定是和类的名称一样。
class:action类的完全限定名,struts需要根据这个配置找到对应的类
method:要执行类中的哪个方法来处理请求。
<action name="HelloAction" class="cn.itcast.action.HelloAction"
method="hello">
result:action类中的方法返回的结果,返回结果一般是字符串,name与其对应,后边根要处理的页面
type:指定结果需要用哪种类型来处理,默认是dispather转发,还有redirect等等。
<result name="success" type="dispather">/index.jsp</result>
</action>
</package>
<!--
包含其他的struts.xml的配置,如果配置比较多的情况下,可以使用
-->
<include file="cn/itheima/b_dynamic/struts.xml"></include>
</struts>
3.2 struts2常量配置
3.2.1 默认配置
相当于框架的一些参数配置,也说常量配置。
默认的常量配置在下边这个路径:
打开之后可以看到:
3.2.2 配置方式
方式一:
在struts.xml中配置
i18n:国际化. 解决post提交乱码
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
方式二:
在src下面创建struts.properties文件
然后从default.properties里边复制已有的配置进行覆盖。
方式三:
在web.xml中配置
<context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
struts启动后,加载配置的顺序为:
default.properties
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
总结:一般我们推荐在struts.xml中配置,用<constant>标签来配置。
3.2.3 一些常用的常量配置
i18n:国际化. 解决post提交乱码
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
指定访问action时的后缀名
http://localhost:8080/struts2_day01/hello/HelloAction.do
<constant name="struts.action.extension" value="action"></constant>
指定struts2是否以开发模式运行
1.热加载主配置.(不需要重启即可生效)
2.提供更多错误信息输出,方便开发时的调试
<constant name="struts.devMode" value="true"></constant>
3.2.4 动态方法调用配置
前边我配置的时候一个action里边只有一个方法可以处理请求,但是有时候我们期望一个action可以有多个方法可以处理请求,不然就太麻烦了,比如处理一个业务的增删改查可以放到一个aciton中去。
我们可以根据访问的地址动态的调用我们的action中的方法,
比如HelloAction_add访问HelloAction类中的add方法,比如HelloAction_update访问HelloAction类中的update方法。
配置如下:
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="dynamic" namespace="/dynamic" extends="struts-default">
<action name="DynamicAction_*" class="cn.itcast.action.DynamicAction"
method="{1}">
<result name="success" type="dispatcher">/index.jsp</result>
</action>
</package>
</struts>
DynamicAction类:
package cn.itcast.action;
public class DynamicAction {
public String add() {
System.out.println("add");
return "success";
}
public String update() {
System.out.println("update");
return "success";
}
}
3.2.5 struts中的默认配置
<package name="default" namespace="/default" extends="struts-default">
method:默认是execute方法
<action name="DefaultAction" class="cn.itcast.action.DefaultAction">
name:默认是success,type:默认是dispathcer
<result >default.jsp</result>
</action>
</package>
package cn.itcast.action;
public class DefaultAction {
public String execute(){
return "success";
}
}
四、Action类的编写方式
4.1 原生POJO
package cn.itcast.action;
public class HelloAction {
public String hello(){
return "success";
}
}
4.2 实现Action接口
package cn.itcast.action;
import com.opensymphony.xwork2.Action;
public class StrutsAction1 implements Action {
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
4.3 继承ActionSupport
package cn.itcast.action;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
public class StrutsAction2 extends ActionSupport {
}
不过这三种方式都得去配置
<package name="Action1" namespace="/action1" extends="struts-default">
<action name="StrutsAction1" class="cn.itcast.action.StrutsAction1">
<result>/index.jsp</result>
</action>
</package>
<package name="Action2" namespace="/action2" extends="struts-default">
<action name="StrutsAction2" class="cn.itcast.action.StrutsAction2">
<result>/index.jsp</result>
</action>
</package>
推荐是用继承ActionSupport方式
ActionSupport类的作用
struts2不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。
Struts2中通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的getter和setter方法。
五、总结
今天我们初步学习了struts2的框架搭建。