Struts2的介绍
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
jar包可去这儿下载 jar包下载
也可以通过maven配置。
1. Struts2的配置
struts2的配置需要一个struts.xml的配置文件,这个文件放在src的包下。因为struts2是基于前端控制器模型的,所以我们还需要配置一个核心过滤器(也叫前端控制器),用以将各个请求分发到action去处理.
web项目结构图
先创建一个test.jsp
<h1>struts2</h1>
<a href="LoginAction">aaaaaaaaaaaaaaaaa</a>
然后写一个Action类叫LoginAction
public class LoginAction {
//方法名用execute,因为Struts2会去找这个名字
public String execute() {
// TODO Auto-generated method stub
System.out.println("123...");
//返回的值,用于在struts.xml中查找跳转页面
return "q";
}
}
- 这是struts.xml这个配置文件,用来配置action类,放在src下
<?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>
<!-- struts为了管理Action的配置,通过报警性管理 -->
<!-- 配置struts的包 -->
<!-- struts-default核心过滤器 -->
<package name="demo" extends="struts-default" namespace="/">
<!-- 配置Action -->
<action name="LoginAction" class="com.demo.LoginAction">
<!--跳转页面 -->
<result name="q">./ss.jsp</result>
</action>
</package>
</struts>
- 这是核心过滤器的配置文件,写在web.xml中
<!-- 配置核心控制器,用以将接收到的请求发送给各个action -->
<!-- 配置Struts2的核心过滤器 -->
<filter>
<!-- 名字可以随便起 -->
<filter-name>struts2</filter-name>
<!-- 核心过滤器 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<!-- 修改常量 -->
<!-- <init-param> -->
<!-- <param-name>struts.action.extension</param-name> -->
<!-- <param-value>xyz</param-value> -->
<!-- </init-param> -->
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- /*用以拦截所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
以上就是一个简单的struts2的实例
2. struts.xml
2.1 package
package标签称为包,这个包与Java中的包的概念不一致。包为了更好管理action的配置。
package标签的属性
- name :包的名称,只有在一个项目中不重名即可。
- extends :继承哪个包,通常值为struts-default。
- namespace :名称空间,与标签中的name属性共同决定访问路径。
名称空间有三种写法- 带名称的名称空间 :namespace=”/aaa”
- 跟名称空间 :namespance=”/”
- 默认名称空间 :namespace=””
2.2 action
action标签配置Action类。
action标签的属性
- name :与namespace共同决定访问路径
- class :Action类的全路径
- method :执行Action中的哪个方法的方法名,默认值execute
Action实际上是要继承ActionSupport类的,当然不继承像上面写也是可以的。继承了可以用一些常量等。
ActionSupport基类中定义了五个标准的返回值 ,当然我们可以自己随意定义返回的名字
String SUCCESS = “success”; //默认是 SUCCESS 类型
String NONE = “none”;
String ERROR = “error”;
String INPUT = “input”;
String LOGIN = “login”;
3. Action的访问
struts2可以对一个action进行不同的方法的访问。
3.1 method方法
action的编写
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
public String find() {
System.out.println("执行了find方法");
return NONE;
}
public String Query() {
System.out.println("执行了query方法");
return NONE;
}
}
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>
<!-- struts为了管理Action的配置,通过报警性管理 -->
<!-- 配置struts的包 -->
<!-- struts-default核心过滤器 -->
<package name="demo" extends="struts-default" namespace="/">
<!-- 配置Action -->
<action name="LoginActionfind" class="com.demo.LoginAction"
method="find">
<result name="q">./ss.jsp</result>
</action>
<action name="LoginActionquery" class="com.demo.LoginAction"
method="Query"></action>
</package>
</struts>
3.2 通过通配符的方式
action的编写
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
public String find() {
System.out.println("执行了find方法");
return NONE;
}
public String Query() {
System.out.println("执行了query方法");
return NONE;
}
public String delete() {
System.out.println("执行了删除方法");
return NONE;
}
}
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>
<!-- struts为了管理Action的配置,通过报警性管理 -->
<!-- 配置struts的包 -->
<!-- struts-default核心过滤器 -->
<package name="demo" extends="struts-default" namespace="/">
<!-- 配置Action -->
<action name="LoginActionfind" class="com.demo.LoginAction"
method="find">
<result name="q">./ss.jsp</result>
</action>
<action name="LoginActionquery" class="com.demo.LoginAction"
method="Query"></action>
<action name="LoginAction_*" class="com.demo.LoginAction"
method="{1}"></action>
</package>
</struts>
还有一种动态的方式,这儿略过,有兴趣的可以自行百度。
4. Action的数据接收与发送
4.1 通过ActionContext
struts2提供了一个类ActionContext来实现对数据的访问,可以访问request,session,application等的数据。
public String find() {
System.out.println("执行了find方法");
ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters();
for (String key : map.keySet()) {
String[] val = (String[]) map.get(key);
System.out.println(key + "----" + val[0]);
}
return NONE;
}
4.2 通过原生方式
Struts2还可以提供和Servlet一样的方式来访问数据
public String find() {
System.out.println("执行了find方法");
ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters();
for (String key : map.keySet()) {
String[] val = (String[]) map.get(key);
System.out.println(key + "----" + val[0]);
}
HttpServletRequest request = ServletActionContext.getRequest();
String name = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(name + "=============" + password);
return NONE;
}
5. 结果页面的配置
<package name="demo" extends="struts-default" namespace="/">
<!-- 配置Action -->
<action name="LoginAction_*" class="com.demo.LoginAction"
method="{1}">
<!-- 转发的方式跳转 -->
<result name="find1" type="dispatcher"></result>
<!-- 重定向的方式跳转 -->
<result name="find2" type="redirect"></result>
</action>
</package>