struts2基于mvc,充当mvc的controller层
新建项目-
添加依赖
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.1</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.5.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> </dependency>
-
resource目录下添加struts.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="struts-default" namespace="/"> </package> </struts>
-
web.xml中的web-app标签中添加struts2的filter
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
struts.xml 文件通常放在 Web 应用的 WEB-INF/classes 目录下,在该目录下的 struts.xml 文件可以被 Struts2 框架自动加载
以下是他的基本结构
<?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>
<!--<constant>标签用于常量的配置-->
<!--调用动态方法
动态方法用于可以使用!符来在url中调用test包里的action
-->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!--设置默认编码集为UTF-8-->
<constant name="struts.il8n.encoding" value="UTF-8" />
<!--设置使用开发模式:可以提供更多的日志信息,但会影响性能-->
<constant name="struts.devMode" value="true" />
<!--<package>标签用于包配置-->
<package name="default" namespace="/" extends="struts-default">
<!--配置Action-->
<action name="index" class="Xxx"/>
<!--配置Result-->
<result type="dispatcher">
<param name="location">/index.jsp</param>
</result>
</action>
</package>
<!-- <include>元素用于包含配置,即可以将struts.xml拆分,拆分的部分可以使用<include>引用 -->
<include file="example.xml"/>
</struts>
-
<struts>
元素是文件的根元素,所有其他元素都放在<struts></struts>
中。 -
<constant>
元素用于进行常量配置。 -
<package>
元素用于进行包配置,在 Struts2 框架中,包用于组织Action
和拦截器
等信息,每个包都是由零个或多个拦截器以及 Action 所组成的集合。 -
<include>
元素用于在一个 struts.xml 配置文件中包含其他的配置文件。
struts2提供了一个Action
接口
public interface Action {
//定义Action接口中包含的一些结果字符串
public static final String SUCCESS="success";
public static final String NONE="none";
public static final String ERROR="error";
public static final String INPUT="input";
public static final String LOGIN="login";
//定义处理用户请求的execute()方法
public String execute() throws Exception;
}
创建action时可以实现这个接口
或者继承ActionSupport
类
ActionSupport提供了很多方法,可以大大简化action的使用,ActionSupport类也实现了Action接口
需要注意的是,由于自定义的 Action 类继承了 ActionSupport 类,因此实际开发中必须定义一个变量 serialVersionUID
。这是因为 ActionSupport 类实现了 Serializable 接口,任何实现了 Serializable 接口的类都必须声明变量 serialVersionUID
,如下所示:
private static final long serialVersionUID = 1L;
写好一个action类之后可以在struts.xml配置文件中进行配置:
<action name="Action名" class="对应的类" method="调用方式(可选)">
...
</action>
通配符
对于一个action类有多个业务可以使用通配符进行业务配置
<package name="default" namespace="/xxx" extends="struts-default">
<action name="前缀_*" class="对应的类" method="{1}">
<result>/index.jsp</result>
</action>
</package>
另外,对<result>
元素也可以采用通配符配置,代码如下所示:
<result>/(1).jsp</result>
struts2访问servlet api
ActionContext
ActionContext
是 Action 执行的上下文对象,在 ActionContext
中保存了 Action 执行所需要的所有对象,包括 request、session 和 application 等
方法声明 | 功能描述 |
---|---|
void put(String key, Object value) | 将 key-value 键值对放入 ActionContext 中,模拟 Servlet API 中的 HttpServletRequest 的 setAttribute() 方法 |
Object get(String key) | 通过参数 key 查找当前 ActionContext 中的值 |
Map<String, Object> get Application() | 返回一个 Application 级的 Map 对象 |
static ActionContext getContext() | 获取当前线程的 ActionContext 对象 |
Map<String, Object> getParameters() | 返回一个包含所有 HttpServletRequest 参数信息的 Map 对象 |
Map<String, Object> getSession() | 返回一个 Map 类型的 HttpSession 对象 |
使用方式如下:
ActionContext context = ActionContext.getContext();
context.put("name","张三"); // 在request中插入
context.getApplication().put("name","张三"); // 在application中插入
context.getSession().put("name","张三"); // 在session中插入
案例:
新建一个action命名为LoginAction,并重载execute方法
@Override
public String execute() throws Exception {
ActionContext context = ActionContext.getContext();
if ("admin".equals(username) && "123".equals(password)) {
// 将信息插入request中
context.put("username", username);
context.put("password", password);
context.put("success", "登陆成功");
return SUCCESS;
} else {
context.put("error", "用户名或密码错误");
return ERROR;
}
}
使用context.put()
方法在request中插入了信息
也可以使用如下方式:
Map req = (Map) ActionContext.getContext().get("request"); // 创建一个map来在request中插入信息
req.put("hello", "Helle world");
然后在jsp页面中通过如下两种方式获取值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<s:property value="#request.hello"/>
${hello}
</body>
</html>
若是el表达式失效则需要添加<%@ page isELIgnored="false" %>
标签进行配置
案例:
在一个表单中把信息提交到login.action
<form action="login" method="post">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="reset" value="重置">
<input type="submit" value="登录">
</form>
在jsp页面中用OGNL表达式取值(struts1中建议使用EL表达式,struts2中建议使用OGNL)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p><s:property value="success"/></p>
<p><s:property value="#request.success"/></p> <!-- 也可以使用这个 -->
<h2>Info</h2>
用户名:<s:property value="username"/><br>
密码:<s:property value="password"/>
</body>
</html>
页面显示如下
ServletActionContext
除了ActionContext,struts2还提供了ServletActionContext类来访问servlet api
ServletActionContext有若干静态方法用来访问api
方法声明 | 功能描述 |
---|---|
static PageContext getPageContext() | 获取 Web 应用的 PageContext 对象 |
static HttpServletRequest getRequest() | 获取 Web 应用的 HttpServletRequest 对象 |
static HttpServletResponse getResponse() | 获取 Web 应用的 HttpServletResponse 对象 |
static ServletContext getServletContext() | 获取 Web 应用的 ServletContext 对象 |
使用:
-
新建一个action,重载其execute方法
@Override public String execute() throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); request.setAttribute("msg", "success"); return SUCCESS; }
-
配置struts.xml
在package元素中添加名为message的action配置信息
<action name="msg" class="zjc.action.MessageAction"> <result name="success">/message.jsp</result> </action>
-
在页面中获取attribute
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ page isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> ${requestScope.msg} </body> </html>
访问连接http://localhost:8080/msg
页面显示结果如下