一、Struts2入门
介绍:Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts2下载
官网地址:http://struts.apache.org/
也可在官网下载以前的版本,我安装的是2.3.24的版本,好像这个版本比较稳定
2.3.24版本,点击直接下载压缩包
下载完成之后解压到安装的目录
- apps:该文件夹用于存放Struts2官网的示例程序
- docs:用于存放官方提供的Struts2文档,包括Struts2快速入门以及API文档
- lib:该文件夹用于存放Struts2的核心类库以及第三方插件类库
- src:该文件存放Struts2的源代码
Struts2项目示例
1.首先创建一个动态的web工程,在WEB-INF的lib目录下导入Struts2开发所需jar包
jar包可在Struts2的示例程序中找到
在示例程序中任选其1进入。(若war文件打不开,将文件名后缀改为zip即可,或者,打开一个压缩包,在压缩软件的界面中找到示例程序所在位置)
点击WEB-INF
点击lib
以下就是创建Struts2项目所需jar包,全选复制到工程的 WEB-INF/lib 下即可
下图是Struts2各个常用jar包的说明
2.创建Action
1).在src目录下创建包,来存放java代码,新建一个类,这个类需要有一个方法,返回字符串;
public class HelloAction{
public String execute() {
return "ok";
}
}
action一共有三种创建方式,以下两种方式如下:
- 创建一个类,实现Action接口,重写execute()方法
import com.opensymphony.xwork2.Action;
public class HelloAction2 implements Action {
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
- 创建一个类继承ActionSupport
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction3 extends ActionSupport {
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
execute()方法的返回值SUCCESS是Action接口中定义的常量
String SUCCESS = “success”; //默认是 SUCCESS 类型
String NONE = “none”;
String ERROR = “error”;
String INPUT = “input”;
String LOGIN = “login”;
当然我们可以自定义返回值的内容。
2).配置 action的访问路径
- 创建struts2的核心配置文件,名字固定为struts.xml,位置在src目录下
- 在struts.xml中引入dtd约束,(同样可以在struts2示例程序中找到)
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd" >
3.配置action
<struts>
<package name="default" extends="struts-default" namespace="/">
<action name="hello" class="ydt.web.myAction.HelloAction">
<result name="ok">/success.jsp</result>
</action>
</package>
</struts>
package标签:
package标签有三个属性
- name:
name属性值根功能本身没有关系的, 在一个配置文件中可以写多个package标签,name属性值不能相同的
- extends:
属性值固定的,struts-default 写了这个属性之后,在package里面配置的类才具有action功能
- namespace:
namespace属性值和action标签里面的name属性值构成访问路径
- namespace="/",访问地址为/hello.action
- namespace="/big",访问地址为/big/hello.action
可以省略,默认为 " / "
action标签:
action标签配置action的访问路径
action标签属性:
- name
namespace属性值和action标签里面的name属性值构成访问路径
在package标签里面写多个action标签,但是action的name属性值不能相同的
- class
action的全类名
- method
比如在action里面默认执行的方法execute方法,但是在action里面写其他的方法
让action里面多个方法执行,使用method进行配置
result标签:
根据action的方法返回值,配置到不同的路径里面,标签里的路径即是跳转的页面
result标签属性
- name属性
必须和action类execute()方法的返回值一样
- type属性
配置如何到路径中(转发或者重定向)
type属性默认值 做转发操作
在struts2源代码中的struts-default.xml文件中,找到标签,所有的result-type都在里面定义了。代码如下:
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
<!-- Deprecated name form scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 -->
<result-type name="redirect-action" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="plaintext" class="org.apache.struts2.dispatcher.PlainTextResult" />
</result-types>
dispatcher:转发
redirect:重定向
redirectAction:重定向到一个action(也可以通过redirect直接实现)
chain:转发到一个action
以上是type属性的几个常见属性值
4.配置struts2过滤器
在web.xml中配置,如下代码(在struts2的示例程序中可找到)
<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>
- 编写跳转页面,文件名为result标签中的名字,随便写几句话
- 启动tomcat服务器
- 在浏览器地址栏输入:
http://localhost:8080(tomcat端口号)/demo1(工程名)/hello.action(struts.xml配置文件中action标签的name属性值)
/hello.actiion的action可以省略,但在有些浏览器不行,所以建议写上
运行成功!
struts2执行过程,图源传智播客
struts2常量配置
struts2框架,帮我们实现一部分功能,struts2里面有常量,在常量里面封装一部分功能
struts2默认的常量位置:
修改struts2默认常量值常用方式:在struts.xml配置文件中进行配置,用constant标签,name属性为常量名,value为常量值
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
表单提交数据到action里面,在action可以获取表单提交数据,
表单提交数据有中文,有乱码问题,解决:
- post提交,可直接配置struts.xml配置文件如上述代码
- get提交,需要自己手写编码转换
所以,如果在action获取表单通过post方式提交中文,中文乱码问题struts2解决了,不需要自己处理问题
分模块开发
单独写配置文件,把配置文件引入到struts核心配置文件中
<include file="cn/itcast/action/hello.xml"></include>
cn/itcast/action是包名,如果hello.xml也在在src目录下,可直接写:
<include file="hello.xml"></include>
访问action的方法
有三种方式实现
第一种、使用action标签的method属性,在这个属性里面写执行的action的方法
- 创建action,创建多个方法:
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
public String add() {
return "add";
}
public String update() {
return "update";
}
}
- 在struts.xml中配置
<package name="test" extends="struts-default">
<!-- 在method属性写上要执行方法的名称 -->
<action name="addAction" class="ydt.web.myAction.TestAction" method="add">
<result name="add">/add.jsp</result>
</action>
<!-- 执行update()方法 -->
<action name="updateAction" class="ydt.web.myAction.TestAction" method="update">
<result name="update">/fff.jsp</result>
</action>
</package>
第二种、使用通配符方式实现
在action标签里面name属性,name属性值里面写 符号 * 星号,method属性="{1}",表示识别一个星号
<package name="test" extends="struts-default">
<action name="hello_*" class="ydt.web.myAction.TestAction" method="{1}">
<result name="update">/fff.jsp</result>
<result name="add">/add.jsp</result>
</action>
</package>
此时地址栏
若是:http://localhost:8080/demo1/hello_add.action,访问的便是add方法,
若是:http://localhost:8080/demo1/hello_update.action,访问的便是update方法,
第三种、动态访问实现(我不会)
在action里面的方法有返回值
如果有返回值时候类型必须是String
action里面的方法可以没有返回值,没有返回值时候,result标签不需要配置
1、把方法写成void
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
public void testMethod() {
System.out.println("执行代码。。。。");
}
}
2、让返回值,返回 ”none”
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
public String execute() {
return NONE;
}
}