第二天:Struts2入门

2023-11-19


第一个Struts2入门案例


Struts2的下载与安装

源码下载地址:http://struts.apache.org/download.cgi
源码目录结构说明:
 - apps:框架本身提供一些案例(学习);
 - docs:框架本身提供的文档(指南和API)。不保证100%正确;
 - lib:Struts2框架需要的jar包及第三方的jar包;
 - src:Struts2框架源码。

Struts2入门理论

开发步骤

 1. 创建WEB 工程;
 2. 导入必要jar包;
 3. 编写JSP 页面;
 4. 编写Action 服务器端处理逻辑;
 5. 进行框架配置web.xml、struts.xml;
 6. 运行测试。
导入必要jar包

Struts运行必要jar包说明:

 - struts2-core-2.3.1.1.jar:Struts 2框架的核心类库;
 -  xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xwork;
 - ognl-3.0.3.jar:对象图导航语言(Object Graph Navigation Language),  struts2框架通过其读写对象的属性;
 - freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写;
 - commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志,包来支持Log4J和JDK 1.4+的日志记录;
 - commons-fileupload-1.2.2.jar: 文件上传组件,2.1.6版本后需要加入此文件;
 - commons-io-2.0.1.jar:传文件依赖的jar包;
 - commons-lang-2.5.jar:对java.lang包的增强。

备注:开发中为了方便导入,可以使用app/struts2-blank.war 携带jar包。

编写JSP 页面

helloword.jsp (发起请求页面)

<body>
    <!-- 添加对Struts2框架的访问链接,Struts2框架默认处理的URL扩展名
        1、不加后缀的;
        2、以.action后缀结尾的;
        3、不符合以上后缀形式的URL,不会进入到Struts2框架内部进行处理,过滤器
           StrutsPrepareAndExecuteFilter检查不符合规则时,直接将其返回给浏览器。
     -->
    <a href="${pageContext.request.contextPath}/struts2/hello.action">HelloWorld</a>
  </body>

success.jsp (结果页面)

<body>
    你好,Struts2!!!
</body>
编写Action 服务器端处理逻辑
package com.study.java.struts2;

package com.study.java.struts2;

/**
* @Name: HelloAction
* @Description: Struts2动作类:是一个普通的JavaBean(POJO对象)
* @Author: XXX
* @CreateDate: XXX
* @Version: V1.0
 */
public class HelloAction {

    /**
    * @Name: execute
    * @Description: Struts2动作方法
    * @Author: XXX
    * @Version: V1.0
    * @CreateDate: XXX
    * @Return: String 返回处理结果逻辑视图
     */
    public String execute() {
        System.out.println("hello world !!!");
        return "success" ;
    }
}

说明:struts2 的Action类似Servlet程序,可以处理用户提交请求,但是Struts2的Action可以POJO对象。

进行框架配置web.xml、struts.xml

配置Struts2核心控制器

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>struts2-hello</display-name>
  <!-- 配置Struts2核心过滤器 -->
  <filter>
    <filter-name>Struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <!-- 修改struts2框架的动作访问后缀 -->
        <!-- 
        <init-param>
            <param-name>struts.action.extension</param-name>
            <param-value>action,do</param-value>
        </init-param>
        -->
  </filter>
  <!-- 过滤器配置/* , 但是struts2默认处理.action结尾请求,分发到相应Action类 -->
  <filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

配置struts.xml

 - 在src目录下建立struts.xml;
 - 参加doc下 hello-world-using-struts-2.html.
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts2配置文件的DTD约束 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- 根元素 -->
<struts>

    <!-- struts2框架常量配置,详情参考后边章节 -->
    <constant name="struts.devMode" value="true"></constant>
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <constant name="struts.serve.static.browserCache" value="true"></constant>

    <!-- 
        package标签:定义包
            作用:对应用中的动作进行模块化管理,如同把类放在不同的包中进行管理一样。
            属性:
                name:包名,整个struts配置范围内唯一。
                extends:继承包名,Struts2中的包是可以继承的,开发环境,自己的包一般都要继承“struts-default”
                abstract:抽象包,没有任何action资源的包可以定义为抽象包。
                namespace:名称空间,默认为""。
                    动作访问路径——http://域名/应用名称/namespace/动作名称.action
     -->
    <package name="p1" extends="struts-default" namespace="/struts2">

        <!-- 
            action标签:定义动作
                属性:
                    name:动作的名称,包范围内唯一
                    class:动作类的全名,可选,默认为com.opensymphony.xwork2.ActionSupport类:
                          位于xwork-core-2.3.15.3.jar核心包中,该类在struts-default.xml中指定。
                    method:动作类中的动作方法,可选,默认为ActionSupport类中的execute()方法
                    <action name="index">
                        <result>/index.jsp</result>
                    </action>
            result标签:定义动作方法执行完成后转向的结果视图。
                属性:
                    name:字符串,对应于动作方法的返回值
                    type:转向的类型,默认为转发——dispatcher类型
                    value:返回的结果视图。
        -->

        <action name="index">
            <result>/index.jsp</result>
        </action>

        <action name="hello" class="com.study.java.struts2.HelloAction" method="execute">
            <result name="success" type="dispatcher">/success.jsp</result>      
        </action>
    </package>

</struts>
运行测试

访问index.jsp,点击HelloWorld链接,结果页面显示,struts2框架访问成功。


Struts2处理流程


体系架构

处理流程

  1. 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 (客户端提交一个HttpServletRequest请求。);

  2. 请求被提交到一系列的过滤器(Filter):如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher。注意:这里是有顺序的,先ActionContext CleanUp,再其他过滤器(Othter Filters、SiteMesh等),最后到FilterDispatcher。FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心;

  3. FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(HttpServlet Request)请求,如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求的处理交给ActionProxy;

  4. ActionProxy通过Configuration Manager(struts.xml)询问框架的配置文件,找到需要调用的Action类;

  5. ActionProxy创建一个ActionInvocation实例,同时ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器);

  6. Action执行完毕后,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。

拦截器与过滤器

1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

      在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

      Struts2的目标很简单–使Web开发变得更加容易。为了达成这一目标,Struts2中提供了很多新特性,比如智能的默认设置、annotation的使用以及”惯例重于配置”原则的应用,而这一切都大大减少了XML配置。Struts2中的Action都是POJO,这一方面增强了Action本身的可测试性,另一方面也减小了框架内部的耦合度,而HTML表单中的输入项都被转换成了恰当的类型以供action使用。开发人员还可以通过拦截器(可以自定义拦截器或者使用Struts2提供的拦截器)来对请求进行预处理和后处理,这样一来,处理请求就变得更加模块化,从而进一步减小耦合度。模块化是一个通用的主题–可以通过插件机制来对框架进行扩展;开发人员可以使用自定义的实现来替换掉框架的关键类,从而获得框架本身所不具备的功能;可以用标签来渲染多种主题(包括自定义的主题);Action执行完毕以后,可以有多种结果类型–包括渲染JSP页面,Velocity和Freemarker模板,但并不仅限于这些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二天:Struts2入门 的相关文章

  • 相机标定-kinectv1外参数标定(没有高度,pnp)

    1 相机镜头表面距离桌面1m 输入的图像没有内参文件 内参和畸变采用freenect包默认参数 棋盘格19 14 每一个4厘米 实际坐标为 左上角 0 0 点 水平向右为x正方向 垂直向下为y轴负方向 2 四个角点分别为 pixel poi
  • centOS 安装 elasticsearch 7.0.0和kibana7.0.0_单机版

    cd opt wget wget https artifacts elastic co downloads elasticsearch elasticsearch 7 0 0 linux x86 64 tar gz tar xzvf ela
  • Matlab 安装和使用xgboost的详细步骤(源码+安装包)

    几个重要的ref 看完后你可以解决你的问题 知乎官网指导 官网讨论 安装MinGW w64 安装需要的模块和源码可以从下面地址下载 链接 https pan baidu com s 1oqCMI7VmVxDzf9Vbaf4VJw pwd 1
  • Arduino与HX711称重传感器握手

    Arduino教程传送门 Arduino与HX711称重传感器握手 1 0 简介 2 0 实验材料 3 0 实验步骤 3 1 根据原理图搭建电路 3 2 新建sketch 拷贝如下代码并进行保存编译上传 3 3 实验现象 4 0 总结 1
  • python基础(更新中)

    文章目录 print函数 数据类型 基本类型 数据拼接 数据转换 条件判断 标识符 关键字 注释 使用帮助 运算符 转义字符 三重引号字符串 字符串格式化 符号格式化字符串 字符串格式的书写 常用格式字符的含义 format 方法格式化字符
  • python loop详解_Python进阶学习笔记(3)-Loop

    while 语法结构 用 隔开 while condition expression x 1 while x lt 4 print x x x 1 Initialize offset offset 8 Code the while loop
  • 硬件基础之电容篇

    一 技术理论 1 电容定义 两个相互靠近的金属板中间夹一层绝缘介质组成的器件 当两端存在电势差时 由于介质阻碍了电荷移动而积累在金属板上 衡量金属板上储存电荷的能力 称为电容 相应的器件称为电容器 电容的符号为C 单位为法拉 F 电容越大
  • 宝塔面板设置域名后无法访问

    设置域名前 需要先备案通过 并解析到宝塔面板的服务器上面才能访问 然后没有做上面相关的时候 设置了域名导致不能访问 解决方式如下 删除域名配置 删除该配置即可 rm f www server panel data domain conf 然
  • HADOOP集群搭建

    1首先新建文件夹路径 root hdp01 home mkdir p home hadoop apps 2修改主机名 vi etc sysconfig network 3配置内网域名映射 vi etc hosts 4配置ssh免密登陆 1在
  • 伴随矩阵及其运算

    关键公式 A B A B
  • mysql jdbc url连接超时_JDBC链接出现超时问题

    今日线上突发一个问题 应用假死 不接受http请求 排查日志 发现有大量的 The last packet successfully received from 异常 首先排查数据库和链接池配置 destroy method close g
  • 利用OpenCV实现软件自动识别核酸检测时间

    文章目录 问题介绍 一 前期准备工作 1 Python的安装 2 安装OpenCV Python开发包 3 安装Tesseract OCR 二 编写程序 1 引入库 2 使用Tesseract做文字识别 OCR 3 筛选日期 4 日期运算
  • 【架构设计】阿里开源架构Cola4.0的项目实践:订单系统

    项目介绍 使用SpringBoot MybaitsPlus Cola 整洁面向对象分层架构 4 0重构订单功能 项目地址 Gitee https gitee com charles ruan smile cola Github https
  • kvm详解【10】:迁移

    文章目录 一 静态迁移 二 动态迁移 一 静态迁移 静态迁移就是虚拟机在关机状态下 拷贝磁盘文件与配置文件到目标虚拟主机中 实现的迁移 分为以下情况 虚拟主机各自使用本地存储存放虚拟机磁盘文件 本文实现基于本地磁盘存储虚拟机磁盘文件的迁移方
  • 值得一看的WinPhone入门系列文章

    今天发现了一些Windows Phone开发入门的系列文章 很适合初学者 下面把其连接总结如下 1 概论 http www winphonecoder com forum php mod viewthread tid 185 extra p
  • buuctf web [ACTF2020 新生赛]Upload

    明了但不明显的文件上传 传个试试 行 抓包吧 php格式不行 就先上传要求的格式 jpg png gif 抓到上传的包之后 再修改成我们想要的 常见的php格式绕过有 php php3 php4 php5 phtml pht 挨个试试 这是
  • Duplicate entry '0' for key 'PRIMARY'的一种可能的解决办法

    在MySQL设计好数据库往往数据库中插入数据的时候 因为主键ID默认是不赋值的 只给其他项目赋值了 相关的SQL代码是这样的 StringBuilder strSql new StringBuilder strSql Append inse
  • 【深度学习】Pytorch 系列教程(十三):PyTorch数据结构:5、数据加载器(DataLoader)

    目录 一 前言 二 实验环境 三 PyTorch数据结构 0 分类 1 张量 Tensor 2 张量操作 Tensor Operations 3 变量 Variable 4 数据集 Dataset 5 数据加载器 DataLoader 一

随机推荐

  • C++ using

    一 C 11前的使用 1 using申明 c primer plus 中 using申明 using 限定名称 限定名称 包含名称空间的名称 举例 using std cout 2 using编译指令 举例 using namespace
  • 华为od机考真题-HJ17坐标移动(中等)

    data input l r 0 0 for ad in data split ad
  • Generative AI 新世界:大型语言模型(LLMs)概述

    在上一篇 Generative AI 新世界 文本生成领域论文解读 中 我带领大家一起梳理了文本生成领域 Text Generation 的主要几篇论文 InstructGPT RLHF PPO GPT 3 以及 GPT 4 本期文章我将帮
  • c语言printf、sprintf、vsprintf用法和区别

    printf sprintf vsprintf 通常用于格式化字符串 通俗来说就是字符串打印或显示格式转换 printf sprintf 需要包含
  • 通俗理解tcp/ip的三次握手和四次分手

    转载地址 https github com jawil blog issues 14 最近在恶补计算机网络方面的知识 之前对于TCP的三次握手和四次分手也是模模糊糊 对于其中的细节更是浑然不知 最近看了很多这方面的知识 也在系统的学习计算机
  • 使用cpolar发布群晖NAS上的网页 上篇(7.X版)

    系列文章 使用cpolar发布群晖NAS上的网页 上篇 7 X版 使用cpolar发布群晖NAS上的网页 中篇 7 X版 使用cpolar发布群晖NAS上的网页 下篇 7 X版 随着网络科技和硬件设施的发展 人们对大容量数据存储的需求与日俱
  • STL——heap(heap并不属于STL容器组件)C++实现

    heap并不归属于STL容器组件 它是个幕后英雄 扮演priority queue的助手 priority queue允许用户以任何次序将任何元素放入容器内 但是取出时一定是从优先级最高的元素开始取 heap正是具有这样的特性 适合作为pr
  • linux ping不通本机(windows),而本机(windows)却能ping通linux

    如果本机可以ping通linux虚拟机 虚拟机的配置又没有其他问题 可以尝试关闭本机防火墙 关闭步骤也可以直接将防火墙关闭 找到两个Ipv4 linux可以ping通本机 外网也可以联了
  • vue中使用vuedraggable实现拖拽分组功能

    vue中实现拖拽分组功能 首先需要实现拖拽功能需要先了解一个组件 vue draggable 附上文档 vue draggable中文文档 先看效果 1 使用命令安装插件 yarn add vuedraggable或者 npm i S vu
  • ORA-01438处理方法

    我的学习过程 今天公司的同事告诉我生产系统出现了ORA 01438错误如下 ORA 01438 value larger than specified precision allowed for this column 由于定位不到具体的表
  • 从 Java 到 Go:构建一个博客系统后端

    目录 1 从 Java 到 Go 基本概念 1 1 包和导入 1 2 变量 常量和类型 1 3 函数和方法
  • C++PrimerPlus 第二章 开始学习C++(复习题含答案)

    C PrimerPlus 第二章 开始学习C 复习题含答案 1 C 程序的模块叫什么 它们叫作函数 2 下面的预处理器编译指令是做什么用的 include lt iostream gt 这将导致在最终的编译之前 使用iostream文件的内
  • unity木船模型,古代帆船模型,古船

    unity木船模型 模型如下图所示 下载链接在文末 点我下载资源 https download csdn net download weixin 43474701 64876331
  • Ant Design Pro 从零到一教程

    说在最前面的话 可是能全网唯一适合小白的antd教程 因为我找了接近一个周的教程 无论是视频 博客等等都没有比较完整的教程 所以才说这可能是唯一全网适合小白教程 文章末有相关学习链接 适用人群 喜欢看文字或者代码学习的人 学习的人掌握基本的
  • 大数据毕设项目 大数据旅游数据分析可视化系统 - python

    文章目录 0 前言 1 课题背景 2 数据处理 3 数据可视化工具 3 1 django框架介绍 3 2 ECharts 4 Django使用echarts进行可视化展示 mysql数据库 4 1 修改setting py连接mysql数据
  • PPT 生成整数序列字典序的r-组合算法

    生成整数序列字典序的r 组合算法 一 PPT效果展示 二 问题 2 1 简述 2 2 算法简述 2 3 例子 三 PPT实现 一 PPT效果展示 二 问题 2 1 简述 给定一个整数序列 1 2 3 n 输出其所有字典序的r 组合 注意事项
  • C# 参数按照ASCII码从小到大排序MD5加密

    region 1 获取参数GetSignParamSrc
  • c++汉诺塔蓝桥杯

    总时间限制 10000ms 单个测试点时间限制 1000ms 内存限制 262144kB 描述 小蓝很喜欢玩汉诺塔游戏 游戏中有三根柱子 开始时第一根柱子上有 n 个圆盘 从上到下圆盘的大小依次为 1 到 n 每次 可以将一个盘子从一根柱子
  • 网页引用Font Awesome图标

    方法一 demo html
  • 第二天:Struts2入门

    第一个Struts2入门案例 Struts2的下载与安装 源码下载地址 http struts apache org download cgi 源码目录结构说明 apps 框架本身提供一些案例 学习 docs 框架本身提供的文档 指南和AP