一、Struts2是什么?
Struts2是一个基于MVC设计模式的Web应用框架,相当于一个Servlet,Struts2作为一个Controller来建立模型与视图的数据交互。Struts2以WebWork为核心,采用拦截器的机制来处理用户请求。业务逻辑控制器和ServletAPI完全脱离。
二、Struts2的使用?
以struts-2.3.14为例:
1、下载Struts2的jar包。新建一个web项目并将需要的jar包导入。不同版本要的包不同,不知道导哪些包的时候,一个保险方法是将struts\apps文件夹下的struts2-blank.war包打开。将里面的WEB-INF\lib下的包导入自己的项目。
2、Struts2配置,配置web.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Struts2Demo</display-name>
<!-- Struts2的过滤器,请求都被映射到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>
</web-app>
3、配置strute.xml文件,配置Action。(可以放在src下,也可以放在WEB-INF/classes下面)
<?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-default包,该包提供了绝大多数的功能-->
<package name="struts2" extends="struts-default">
<!-- action元素与表单对应 -->
<action name="login" class="fang.LoginAction">
<result name="success">/welcome.jsp</result><!-- result为action处理结果 -->
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
4、写一个对应的Action,继承自ActionSupport。
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name;
private String passwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
@Override
public String execute() {
if ("admin".equals(name) && "admin".equals(passwd)) {
return SUCCESS;
} else
return ERROR;
}
}
5、对应的JSP文件
(1)login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><s:text name="登陆页面"/></title>
</head>
<body>
<s:form action="login"><!--action的值对应于struts.xml文件中的<action ...> 中的name属性-->
<s:label value="请登录"/><!-- 文字标签-->
<s:textfield name="name" key="用户名"/><!--文本框-->
<s:textfield name="passwd" key="密码"/>
<s:submit value="登录"/>
</s:form>
</body>
</html>
(2)welcom.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><s:text name="欢迎页面"/> </title>
</head>
<body>
欢迎您,<s:property value="name"/><!--显示Action中的account属性-->
</body>
</html>
(3)error.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><s:text name="登录失败页面"/> </title>
</head>
<body>
<s:text name="登录失败。。。"/>
</body>
</html>
执行:http://localhost:8080/Struts2Demo/login.jsp
三、几点说明
1、Struts2的工作流程:
Struts2抛弃了request、response等Servle API。在调用Action的执行方法(如:execute)前,struts2
的会从request中获取参数,并通过setter方法设置到Action属性。
访问到login.jsp后,找到表单要提交到的action:;Struts2截获所有的请求;
通过action的值,在struts.xml配置文件中找到对应的Action。生成一个Action实例,并并将提交的数据设置到该实例中;调用execute()主方法;
根据执行完对应的Action后返回结果,struts.xml配置文件中/welcome.jsp
/error.jsp
展现对应的jsp页面。
2、Struts2中每个Action有多个实例(Struts1中所有的Action只有一个实例。)每处理一次请求生成一个实例,处理完即销毁。因此Struts2是线程安全的。
3:Action:
(1)自定义Action一般直接继承自ActionSupport类,定义变量,重写execute()方法。变量的值被Struts2通过setter方法自动复制,execute直接使用即可。
execute的执行结果返回值配置在中。
(2)事实上任何的POJO都可以作为Action,只要该Action有public String execute()方法。
这样的好处是不与Struts2发生耦合,代码不依赖Struts2类库。