[Java Web] Struts 2

一、简述

MVC全名Model View Controller,是一种将业务逻辑、数据和界面显示分离的方法。

Struts是一个基于MVC模式设计的Web应用框架,其各层结构功能如下:

  1. 模型(Model):负责管理应用程序的数据,通过响应视图的请求和控制器的指令来更新数据。
  2. 视图(View):用于应用程序中处理数据的显示。是与用户的交互页面,负责接收用户的输入信息,并将处理后的数据显示。
  3. 控制器(Controller):负责接收用户的请求和数据,并判断应当将请求交由什么模型来处理已经处理后的数据由什么视图来显示。

Struts 2的请求执行流程如下:

  1. 客户端发送的请求通过StrutsPrepareAndExecuteFilter过滤器。
  2. Action映射器查询对应的Action对象并返回Action对象的代理,代理从配置文件读取相关配置并经过一系列拦截器后调用指定Action对象。
  3. 当Action处理请求完成后,将响应的处理结果在视图层上显示。在视图层通过映射类型变量或Struts标签显示数据,最后将HTTP响应返回给浏览器。

二、控制器

Action是Struts 2框架的核心。每个URL映射到特定的Action上,后者提供对用户的请求进行处理所需的逻辑。

Action的两个重要功能分别是将数据从请求传递到视图和协助框架确定什么结果应该呈现在视图中。

Action提供了部分处理结果的预定义字符串变量:

静态变量 说明
ERROR Action执行失败的返回值,如验证信息错误。
INPUT 返回某个输入信息页面的返回值,如修改信息页面。
LOGIN 需要用户登陆的返回值,如登陆验证失败需要重新登陆。
NONE Action执行成功的返回值,不返回到成功页面。
SUCCESS Action执行成功的返回值,返回到成功页面。

ActionSupport类实现了Action接口,创建控制器时一般需要继承该类。

用户提交表单后信息会自动注入到与Action对象响应的属性中,前提是在Action类中必须提供属性的setter方法。

//MessageAction.java
package action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Map;

public class MessageAction extends ActionSupport {
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public String execute() throws Exception {
        Map<String, Object> session = ActionContext.getContext().getSession();
        session.put("message", message);
        return (message == null || message.isEmpty()) ?
                ActionSupport.ERROR : ActionSupport.SUCCESS;
    }
}

//index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<form action="MessageAction.action" method="post">
    <input type="text" name="message" id="message" placeholder="输入文本"/>
    <input type="submit" value="提交"/>
</form>

<c:if test="${sessionScope.message != null && !sessionScope.message.isEmpty()}">
    <c:out value="文本:${sessionScope.message}"/>
</c:if>
</body>
</html>

//struts.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <!-- namespace决定了Action的访问路径 -->
    <package name="action" namespace="/" extends="struts-default">
        <action name="MessageAction" class="action.MessageAction">
            <result name="error">/index.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <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>
</web-app>

三、动态方法调用

动态方法调用是为了让Action对应多个请求处理,以避免Action的数量太多。

1.感叹号方式是在请求Action的URL地址后加上请求字符串(方法名),与Action对象中的方法进行匹配。URL与请求字符串之间以感叹号进行分隔,该方式一般不推荐使用。

//index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<a href="OperateAction!insert.action">添加</a>
<a href="OperateAction!delete.action">删除</a>
<a href="OperateAction!update.action">更新</a>
<a href="OperateAction!select.action">查询</a>

<c:if test="${sessionScope.operate ne null}">
    <c:out value="操作:${sessionScope.operate}"/>
</c:if>
</body>
</html>

//OperateAction.java
package action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Map;

public class OperateAction extends ActionSupport {
    private String setAttribute(String operate) {
        Map<String, Object> session = ActionContext.getContext().getSession();
        session.put("operate", operate);
        return operate;
    }

    public String insert() {
        return setAttribute("insert");
    }

    public String delete() {
        return setAttribute("delete");
    }

    public String update() {
        return setAttribute("update");
    }

    public String select() {
        return setAttribute("select");
    }
}

//struts.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <!-- Struts 2.5后调用动态方法需要关闭strict-method-invocation -->
    <package name="action" namespace="/" extends="struts-default" strict-method-invocation="false">
        <action name="OperateAction" class="action.OperateAction">
            <result name="select">/index.jsp</result>
            <result name="delete">/index.jsp</result>
            <result name="update">/index.jsp</result>
            <result name="insert">/index.jsp</result>
        </action>
    </package>
</struts>

2.用户发送Action请求时,在默认情况下执行execute方法。但在多个业务逻辑分支的Action对象中,需要通过指定<action>标签中的method属性,从而调用对应的逻辑方法进行处理。

//OperateAction.java
package action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Map;

public class OperateAction extends ActionSupport {
    private void setAttribute(String operate) {
        Map<String, Object> session = ActionContext.getContext().getSession();
        session.put("operate", operate);
    }

    public String insert() {
        setAttribute("insert");
        return ActionSupport.SUCCESS;
    }

    public String delete() {
        setAttribute("delete");
        return ActionSupport.SUCCESS;
    }

    public String update() {
        setAttribute("update");
        return ActionSupport.SUCCESS;
    }

    public String select() {
        setAttribute("select");
        return ActionSupport.SUCCESS;
    }
}

//index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<a href="insertAction.action">添加</a>
<a href="deleteAction.action">删除</a>
<a href="updateAction.action">更新</a>
<a href="selectAction.action">查询</a>

<c:if test="${sessionScope.operate ne null}">
    <c:out value="操作:${sessionScope.operate}"/>
</c:if>

</body>
</html>

//struts.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <package name="action" namespace="/" extends="struts-default" strict-method-invocation="false">
        <action name="insertAction" class="action.OperateAction" method="insert">
            <result name="success">/index.jsp</result>
        </action>
        <action name="deleteAction" class="action.OperateAction" method="delete">
            <result name="success">/index.jsp</result>
        </action>
        <action name="updateAction" class="action.OperateAction" method="update">
            <result name="success">/index.jsp</result>
        </action>
        <action name="selectAction" class="action.OperateAction" method="select">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

3.在配置文件struts.xml中支持使用通配符,达到简化配置代码的效果。是动态方法调用中最常用的一种方式。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <package name="action" namespace="/" extends="struts-default" strict-method-invocation="false">
        <action name="*Action" class="action.OperateAction" method="{1}">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

四、映射类型

在Web项目配置Struts 2框架,使用Action对象处理用户的请求。这时一般通过ActionContext对象获取映射类型的request、session和application变量,用于保存处理后的信息。

//SetAction.java
package action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Map;

public class SetAction extends ActionSupport {
    @Override
    @SuppressWarnings("unchecked")
    public String execute() throws Exception {
        ActionContext context = ActionContext.getContext();
        Map<String, Object> request = (Map<String, Object>) context.get("request");
        Map<String, Object> session = context.getSession();
        Map<String, Object> application = context.getApplication();

        request.put("requestValue", 0);
        session.put("sessionValue", 1);
        application.put("applicationValue", 2);

        return ActionSupport.SUCCESS;
    }
}

//struts.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>
    <package name="action" namespace="/" extends="struts-default">
        <action name="setAction" class="action.SetAction">
            <result>/index.jsp</result>
        </action>
    </package>
</struts>

//index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<a href="setAction.action">获取</a>

<c:if test="${requestScope.requestValue ne null}">
    <c:out value="Request Value =  ${requestScope.requestValue}"/>
</c:if>
<c:if test="${sessionScope.sessionValue ne null}">
    <c:out value="Session Value =  ${sessionScope.sessionValue}"/>
</c:if>
<c:if test="${applicationScope.applicationValue ne null}">
    <c:out value="Application Value = ${applicationScope.applicationValue}"/>
</c:if>
</body>
</html>

原文地址:https://www.cnblogs.com/arseneyao/p/9405837.html

时间: 2024-07-30 14:39:06

[Java Web] Struts 2的相关文章

使用Struts框架的Java Web项目中的两个Session的区别和常见的Session取值为空的错误

我的百度知道回答,感觉这个知识很有意义,专门贴出来. 不过还有待验证的地方,就是 ActionContext.getContext().getSession("name", "Tom"); //如果在JSP中通过 EL 或者 Struts2 标签怎么显示? 以下是回答正文. 很多初学Java Web的同学因为使用 Strut2框架而分不清两个 Session的区别. 1.   JSP/Servlety有个原生的 session 对象,这是9大内置对象中的一个,书上写

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Java Web整合开发(16) -- Struts 2

一. Struts 2.x 概述 不继承任何类的Action Struts 2的Action并不一定要实现Action接口或者继承ActionSupport,任何POJO都可以做Action,只要这个Action具有public String execute()方法. Action的可执行方法 execute()是Action的默认方法.Struts 2还可以执行Action的其他方法,只要这些方法没有参数,并返回String类型.这些方法也可以有throws声明,也可以没有.Struts 2会

Java Web编程的主要组件技术——Struts入门

参考书籍:<J2EE开源编程精要15讲> Struts是一个开源的Java Web框架,很好地实现了MVC设计模式.通过一个配置文件,把各个层面的应用组件联系起来,使组件在程序层面联系较少,耦合度较低.它定义了自己的标签库来实现是视图层,创建了一个内在的Servlet,叫ActionServlet,作为自己的控制器,建立一个叫Action类的对象实现业务逻辑.视图组件和业务逻辑组件的关系在struts-config.xml的配置文件中声明.当Struts应用程序启动时,它首先从struts-c

第一个使用Struts框架的Java Web项目

今天早上第一次完成了一个HelloWorld级别的Java Web项目login(登陆验证)项目. 按照<JavaEE主流开源框架(第二版)>的指导做的. 1.先下载了struts:struts-2.3.16.3-all.zip,解压之后看到struts-2.3.16.3目录下有一个lib目录,这个目录里的全部是jar文件,采用struts框架需要使用jar包都在这个目录下. 2.根据书上的说明,先在myeclipse8.5中建立web project,命名为Login. 然后把下面的五个ja

[Java Web]2\Web开发中的一些架构

1.企业开发架构: 企业平台开发大量采用B/S开发模式,不管采用何种动态Web实现手段,其操作形式都是一样的,其核心操作的大部分都是围绕着数据库进行的.但是如果使用编程语言进行数据库开发,要涉及很多诸如事务.安全等操作问题,所以现在开发往往要通过中间件进行过渡,即,程序运行在中间件上,并通过中间件进行操作系统的操作,而具体一些相关的处理,如事务.安全等完全由中间件来负责,这样程序员只要完成具体的功能开发即可. 2.Java EE架构: Java EE 是在 Java SE 的基础上构建的,.NE

MVC模式在Java Web应用程序中的实例分析

MVC作为软件架构中及其重要的一种架构思想,在实际的java web项目开发中被开发者们广泛的应用.遵循MVC思想的所产生的解决方法也可以因实际情况的不同来进行不同的选择.这里以一个应用struts+hibernate+jsp的实例来进一步认识MVC. 学生管理系统中添加学生模块的的MVC架构: Model(系统的业务逻辑):Hibernate进行管理的数据实体+定义的业务逻辑的体现--------数据库操作类,也就是通常所说的Dao层 数据实体(PO,Entity): package PO;

自我总结(四) ---java web项目完结,j2ee的开始

自我完善的过程就是在不断的自我总结不断的改进. 前半个月刚好把项目做完了,项目也答辩了.总的来说吧,我觉得自己在java web这块知识上不算是彻彻底底把他弄懂了,就是说到的知识点都能够回答的上来一些.因为在答辩之前做了一些工作嘛!答辩成绩还好!其实刚开始做这个项目病虫害防治系统的时候,我觉得我一个人应该是做不完的.虽然表面上我说我会做完的,最后呢还是有一些功能没有去完善它,只是简单的去处理了一下.(对于信息的验证,我就全部一起验证,就没有一个一个的去验证.还有就是在管理员登陆的时候有个权限,这

Java Web架构知识整理——记一次阿里面试经历

惭愧,从一次电面说起.我个人在某国企做一名软件设计师,国企大家都懂的,待遇一般而且没啥意思,做的方向基本都是操作系统.驱动和工具软件的开发,语言基本都是C/C++.最近也想跳槽,刚好有幸得到了一次阿里的面试机会,于是就试了试. 首先是电话面试,当时正在上班,人多口杂,好不容易找了个没人的地方开始面试.面试的方向是Java Web,面试官很nice,跟朋友一样,一开始问了些比较基础的东西,比如hashmap/hashtable的区别和优缺点,我答得还行,而且对于原理的东西还算讲的比较透彻. Jav