struts2基于mvc,充当mvc的controller层

新建项目
  1. 添加依赖

    <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>
    
  2. 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>
    
  3. 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配置文件

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 配置文件中包含其他的配置文件。
Action配置

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>

页面显示如下

struts2学习笔记_struts2

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 对象

使用:

  1. 新建一个action,重载其execute方法

    @Override
    public String execute() throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();
        request.setAttribute("msg", "success");
        return SUCCESS;
    }
    
  2. 配置struts.xml

    在package元素中添加名为message的action配置信息

    <action name="msg" class="zjc.action.MessageAction">
        <result name="success">/message.jsp</result>
    </action>
    
  3. 在页面中获取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

    页面显示结果如下

    struts2学习笔记_jsp_02