struts2 订阅
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。 展开全文
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
信息
外文名
Struts 2
类    别
框架
理    解
WebWork+struts1的的更新产品
解    释
Struts的下一代产品
Struts 2发展历史
2000年5月发展至今,Struts1已经成为了一个高度成熟的框架,不管是稳定性还是可靠性都得到了广泛的证明。市场占有率超过20%,拥有丰富的开发人群,几乎已经成为了事实上的工业标准。但是随着时间的流逝,技术的进步,Struts1的局限性也越来越多地暴露出来,并且制约了Struts1的继续发展。对于Struts1框架而言,由于与JSP/Servlet耦合非常紧密,因而导致了一些严重的问题。首先,Struts1支持的表现层技术单一。由于Struts1出现的年代比较早,那个时候没有FreeMarker、Velocity等技术,因此它不可能与这些视图层的模版技术进行整合。其次,Struts1与Servlet API的严重耦合,使应用难于测试。最后,Struts1代码严重依赖于Struts1 API,属于侵入性框架。从目前的技术层面上看,出现了许多与Struts1竞争的视图层框架,比如JSF、Tapestry和spring MVC等。这些框架由于出现的年代比较近,应用了最新的设计理念,同时也从Struts1中吸取了经验,克服了很多不足。这些框架的出现也促进了Struts的发展。Struts1已经分化成了两个框架:第一个是在传统的Struts1的基础上,融合了另外的一个优秀的Web框架WebWork的Struts2。Struts 2虽然是在Struts1的基础上发展起来的,但是实质上是以WebWork为核心的。Struts2为传统的Struts1注入了WebWork的先进的设计理念,统一了Struts1和WebWork两个框架。Struts1分化出来的另外一个框架是Shale。这个框架远远超出了Struts1原有的设计思想,与原有的Struts1关联很少,使用了全新的设计思想。Shale更像一个新的框架而不是Struts1的升级。
收起全文
精华内容
下载资源
问答
  • Struts2

    千次阅读 2019-01-30 08:26:39
    Struts2是一个WEb端的MVC框架。 MVC模式: 模型:分为业务模型和数据模型 视图:负责显示页面,渲染模型 控制器:接收用户请求,调用模型处理用户请求,选择视图 目前在Model2中我们使用Servlet作为控制器: ...

    Struts2是一个WEb端的MVC框架。

    • MVC模式:
    • 模型:分为业务模型和数据模型
    • 视图:负责显示页面,渲染模型
    • 控制器:接收用户请求,调用模型处理用户请求,选择视图
    • 目前在Model2中我们使用Servlet作为控制器:
    • Servlet作为控制器的过程
    1. 接收用户请求
    2. 将参数封装为java中的对象
    3. 调用service来处理业务逻辑
    4. 根据service返回的结果选择视图
    • Filter作为控制器比Servlet更强
    • 同时filter还多了filefilterChina

    Servlet仅仅解决了底层问题很多东西需要手动(封装、验证访问数据、呈现表示层(返回一个页面、Servlet提供转发和重定向))

    编写Struts的hello

    1. 解压apps目录下的Struts2-blank.war包
    2. 创建动态web工程
    3. 将包导入lib
    4. 在项目中添加Struts2的核心控制器,接管发送的所有请求(Struts核心控制器就是过滤器只需在web.xml中引入该过滤器)
    5. 创建自己的Action类,Struts2中的Action就是一个POJO(java的的普通类)
    6. 配置文件放在SRC下

       

       

      http://localhost:8080/项目名/文件名

      因为有俩个控制器一个action 一个filter.StrutsPrepareAndExecuteFilter

      filter找文件名之间有对应关系

      有全类名访问

      
      
      public class Hello {
      	public String execute() {
      		System.out.println("你好");
      		return "success";
      	}
      }
      

      配置文件

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

       

    展开全文
  • Struts2视频_全面开战

    万人学习 2015-05-12 16:23:30
    本Java视频教程对 Struts2 庞杂的技术点进行抽丝剥茧,提炼出企业开发的核心技术和重要技能。每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。
  • struts2必备jar包官方绿色版

    万次下载 热门讨论 2012-10-08 18:02:42
    struts2最新官网的jar包,已经是最少的包的无法再删除了, commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar commons-logging-1.1.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.jar ...
  • Struts2-1.Struts2概述

    万次阅读 2018-01-04 18:12:28
    1.1什么是Sturts2 ... 全新的 Struts 2Struts 1 差别巨大,但是相对于 WebWork,Struts 2 的变化很小。 Struts 2并不是一门完全独立的技术,而是建立在其他 Web 技术之上的一个 MVC 框架。Stru

    1.1什么是Sturts2

        Struts 2 是 Struts 的下一代产品,它是在 Struts 1 和 WebWork 技术的基础上进行了合并
    
        全新的 Struts 2 与 Struts 1 差别巨大,但是相对于 WebWork,Struts 2 的变化很小。
    
        Struts 2并不是一门完全独立的技术,而是建立在其他 Web 技术之上的一个 MVC 框架。Struts 2 以WebWork 为核心,采用拦截器的机制来处理用户的请求,这种设计使得业务逻辑控制器能够与 Servlet API 完全脱离开,所以 Struts 2 可以理解为 WebWork 的更新产品。实际上,WebWork 和 Struts 社区已经合二为一,即现在的 Struts 2 社区。
    

    这里写图片描述这里写图片描述

    1.2 回顾MVC模式
    这里写图片描述

    根据url绑定的Servlet,web.xml
    获取数据,request.getParameter 类型转换
    封装数据,request,session,application 
    根据业务处理结果,跳转到对应的视图
    

    1.3 Struts快速入门

    1.3.1导包
    

    这里写图片描述

    1.3.2 Action
    

    这里写图片描述

    1.3.3配置struts.xml
    

    这里写图片描述

    1.3.4配置web.xml
    

    这里写图片描述

    1.4 注意事项

    必须要继承struts-default
    此处完成了url和Java类的映射配置
    此处完成了视图跳转的控制
    

    1.5 Struts2实现MVC

    在 Struts 2 中,
        V:视图层对应视图组件,通常是指 JSP 页面,也适用于 Velocity、FreeMarker等其他视图显示技术。
        M:模型层对应业务逻辑组件,它通常用于实现业务逻辑及与底层数据库的交互等。
        C:系统核心控制器为 Struts 2 框架提供的 StrutsPrepareAndExecuteFilter,它是一个起过滤作用的类,能根据请求自动调用相应的 Action。而业务逻辑控制器是开发者自定义的一系列Action,在 Action 中负责调用相应的业务逻辑组件,来完成调用处理。
        所以,我们一般把Action归为模型层,但是它是属于模型层的控制器
    

    这里写图片描述

    1.6 Struts2工作流程
    这里写图片描述

    1.7 Struts2工作模式

    每次请求都会创建一个新的Action对象,与Servlet是不同的
    Servlet的生命周期--单例模式
    Action:每次发送一个请求,就会创建一个新的Action
    
    展开全文
  • K8 Struts2 Exploit(Struts2综合漏洞利用工具)

    千次下载 热门讨论 2015-05-30 09:29:02
    Struts2漏洞检测工具 Struts2漏洞测试工具 K8 struts2 exploit Test Struts2 GetShell 目前已支持以下struts2漏洞编号 (S2-005 s2-009 s2-013 s2-016 s2-019 s2-020) [+] S2-020 CVE-2014-0094 支持GetShell (这洞...
  • Struts2-10.Struts2标签库

    万次阅读 2018-01-05 13:52:19
    10.1什么是Struts2标签库 对于一个 MVC 框架来说,重点是实现两个部分,一个是控制器部分,一个是视图部分。 Struts 2 框架也把重点放在了这两部分上:控制器主要由 Action 来提供支持,而视图则是由大量的标签来...

    10.1什么是Struts2标签库

    对于一个 MVC 框架来说,重点是实现两个部分,一个是控制器部分,一个是视图部分。
    Struts 2 框架也把重点放在了这两部分上:控制器主要由 Action 来提供支持,而视图则是由大量的标签来提供支持。
    Struts 2 标签库使用 OGNL 表达式作为基础,实现对于集合、对象访问的功能。
    

    10.2 Struts2标签分类

    Struts 2 的标签非常多,大致分为两类,一类是用户界面标签,也称为 UI 标签;另一类
    是非用户界面标签,也称为非 UI 标签。
    (1) UI 标签主要用来生成 HTML 元素,按其功能可分为三类。
    表单标签:主要用于生成 HTML 页面的 form 元素,以及普通表单元素的标签。
    非表单标签:主要用于生成页面上的树、Tab 等标签。
    Ajax 标签用于 Ajax(Asynchronous JavaScript And XML)支持的标签。
    
    (2) 非 UI 标签主要用于数据访问和逻辑控制,按其功能,可分为两类。
    数据标签:主要用来提供数据访问相关的功能。
    控制标签:主要用来完成条件逻辑、循环逻辑的控制,也可用于对集合的操作。
    

    10.3 使用Struts2标签

    <%@ taglib prefix="s" uri="/struts-tags" %>
    

    10.4 Struts2表单标签
    这里写图片描述
    这里写图片描述

    10.5 Struts2数据标签

    a) <s:property>
    
        property 标签的作用就是输出指定值。property 标签输出 value 属性指定的值,如果没有指定 value 属性,则默认输出 ValueStack 栈顶的值。
        该标签有如下几个属性。
        default:可选属性,如果输出的属性值为null,则显示该值
        案例:访问该页面的时候,传参和不传参,看看效果
    

    这里写图片描述

    b) <s:date>
    

    这里写图片描述

    c) <s:include>
        <s:include value="foot.jsp"></s:include>
    

    10.6 Struts2控制标签

    Struts 2 的非 UI 标签包括控制标签和数据标签,主要用于完成流程控制,数据标签主要用于访问 ValueStack 中的数据;控制标签可以完成输出流程控制,例如分支、循环
    
    a) if/else
    

    这里写图片描述

    b) <s:iterator>
    
    iterator 标签的属性如下所示。
        1.value:可选属性,指定被迭代的集合,被迭代的集合通常都使用 OGNL 表达式指定;如果没有指定 value 属性,则使用 ValueStack 栈顶的集合。
        2. id:可选属性,该属性指定了集合里元素的 ID(现已用 var 替代)。
        3.status:可选属性,指定迭代时的 IteratorStatus 实例,通过该实例可以判断当前迭代元素的属性,例如是否是最后一个,以及当前迭代元素的索引等。
        4.Begin:开始迭代的索引位置,开始索引从 0 开始。
        5.End:结束索引的索引位置,集合元素个数要小于或等于此结束索引。
        6.Step:迭代的步长,每次迭代时索引的递增值,默认为 1。
    
        如果指定 status 属性,通过指定该属性,在遍历集合时会有一个 IteratorStatus 实例对象,
        该实例对象包含如下几种常用方法。
        getCount:返回当前已经遍历的集合元素数目。
        isEven::返回当前遍历的元素索引是否为偶数。
        isOdd:返回当前遍历的元素索引是否为奇数。
        isFirst:返回当前遍历元素是否为集合的第一个元素。
        isLast:返回当前遍历元素是否为集合的最后一个元素。
    
    c) 隔行变色效果(2种方式)![这里写图片描述](https://img-blog.csdn.net/20180105135202756?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzk4NTY2NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    

    这里写图片描述

    展开全文
  • Struts2入门详解

    万次阅读 2016-05-29 22:21:31
    如何搭建Struts2项目导入相关架包编写web.xml,配置strus2过滤器 <filter-name>struts2 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class

    如何搭建Struts2项目

    导入相关架包

    编写web.xml,配置strus2过滤器

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

    编写Struts2配置文件struts.xml

    <?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>
    	<package name="default" namespace="/user" extends="struts-default">
    		<action name="regist" class="cn.itcast.action.RegistAction">
    			<result name="input">/success.jsp</result>
    		</action>
    	</package>
    </struts>
    

    访问路径 /user/regist.action
    name 包名称,在struts2的配置文件文件中 包名不能重复 ,name并不是真正包名,只是为了管理Action
    namespace 和 action的name属性,决定 Action的访问路径 (以/开始 )
    extends 继承哪个包,通常开发中继承 struts-default 包 (struts-default包在 struts-default.xml定义 )
    继承struts-default包后,可以使用 包中定义拦截器和结果类型
    action元素配置默认值
    package 的namespace 默认值
    action 的class 默认值 ActionSupport 类
    result 的 name 默认值 success

    默认Action 和 Action的默认处理类

    1. 默认Action , 解决客户端访问Action不存在的问题 ,客户端访问Action, Action找不到,默认Action 就会执行

    2. 默认处理类 ,客户端访问Action,已经找到匹配元素,但是元素没有class属性,执行默认处理类

      • 在struts-default.xml 配置默认处理类 ActionSupport

    Struts2的常量配置

    1. struts2 默认常量 在 default.properties 中配置
    2. 开发者自定义常量
    struts.xml
    	格式 : <constant name="struts.devMode" value="true" />
    struts.properties
        格式 : struts.devMode = true
    web.xml 
        格式 : 
    	<filter>
    		<filter-name>struts2</filter-name>
    		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    		<init-param>
    			<param-name>struts.devMode</param-name>
    			<param-value>true</param-value>
    		</init-param>
    	</filter>
    
    1. 常用常量
    <constant name="struts.i18n.encoding" value="UTF-8"/>  ----- 相当于request.setCharacterEncoding("UTF-8"); 解决post请求乱码 
    <constant name="struts.action.extension" value="action"/>  --- 访问struts2框架Action访问路径 扩展名 (要求)
    struts.action.extension=action, 默认以.action结尾扩展名 和 不写扩展名 都会分发给 Action
    <constant name="struts.serve.static.browserCache" value="false"/> false不缓存,true浏览器会缓存静态内容,产品环境设置true、开发环境设置false 
    <constant name="struts.devMode" value="true" />  提供详细报错页面,修改struts.xml后不需要重启服务器 
    

    Action

    Action书写的的三种格式

    第一种
    Action可以是 POJO ((PlainOldJavaObjects)简单的Java对象) ---- 不需要继承任何父类,实现任何接口
    * struts2框架 读取struts.xml 获得 完整Action类名
    * obj = Class.forName(“完整类名”).newInstance();
    * Method m = Class.forName(“完整类名”).getMethod(“execute”); m.invoke(obj); 通过反射 执行 execute方法

    第二种
    编写Action 实现Action接口
    Action接口中,定义默认五种 逻辑视图名称
    public static final String SUCCESS = “success”; // 数据处理成功 (成功页面)
    public static final String NONE = “none”; // 页面不跳转 return null; 效果一样
    public static final String ERROR = “error”; // 数据处理发送错误 (错误页面)
    public static final String INPUT = “input”; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
    public static final String LOGIN = “login”; // 主要权限认证 (登陆页面)
    五种逻辑视图,解决Action处理数据后,跳转页面

    第三种
    编写Action 继承ActionSupport (推荐)
    在Action中使用 表单校验、错误信息设置、读取国际化信息 三个功能

    Action的配置method(通配符)

    1. 在配置 元素时,没有指定method属性, 默认执行 Action类中 execute方法
    2. 使用通配符* ,简化struts.xml配置
    <a href="${pageContext.request.contextPath }/user/customer_add.action">添加客户</a>
    <a href="${pageContext.request.contextPath }/user/customer_del.action">删除客户</a>
    

    struts.xml

    <action name="customer_*" class="cn.itcast.struts2.demo4.CustomerAction" method="{1}"></action>   ---  {1}就是第一个* 匹配内容
    

    动态方法调用

    访问Action中指定方法,不进行配置

    1. 在工程中使用 动态方法调用 ,必须保证 struts.enable.DynamicMethodInvocation = true 常量值 为true
    2. 在action的访问路径 中 使用 “!方法名”

    页面

    <a href="${pageContext.request.contextPath }/user/product!add.action">添加商品</a>
    

    配置

    <action name="product" class="cn.itcast.struts2.demo4.ProductAction"></action>
    	执行 ProductAction 中的 add方法
    

    Action访问Servlet API

    1、 在Action 中解耦合方式 间接访问 Servlet API --------- 使用 ActionContext 对象

    在struts2 中 Action API 已经与 Servlet API 解耦合 (没有依赖关系 )

    • Servlet API 常见操作 : 表单提交请求参数获取,向request、session、application三个范围存取数据

    actionContext = ActionContext.getContext();

    1. actionContext.getParameters(); 获得所有请求参数Map集合
    2. actionContext.put(“company”, “传智播客”); / actionContext.get(“company”) 对request范围存取数据
    3. actionContext.getSession(); 获得session数据Map,对Session范围存取数据
    4. actionContext.getApplication(); 获得ServletContext数据Map,对应用访问存取数据

    2、 使用接口注入的方式,操作Servlet API (耦合)

    1. 要求action类必须实现提定接口。
      ServletContextAware : 注入ServletContext对象
      ServletRequestAware :注入 request对象
      ServletResponseAware : 注入response对象

    2. 重定接口中的方法。
      private HttpServletRequest request;

    3. 声明一个web对象,使用接口中的方法的参数对声明的web对象赋值.

      public void setServletRequest(HttpServletRequest request) {
      	this.request = request;
      }
      

    3、 在Action中直接通过 ServletActionContext 获得Servlet API

    ServletActionContext.getRequest() : 获得request对象 (session)
    ServletActionContext.getResponse() : 获得response 对象
    ServletActionContext.getServletContext() : 获得ServletContext对象
    ServletActionContext.getPageContext().getSession(); //获取session等对象

    Action处理请求参数

    第一种 :Action 本身作为model对象,通过成员setter封装 (属性驱动 )

    页面

    用户名  <input type="text" name="username" />
    

    Action :

    public class RegistAction1 extends ActionSupport {
    	private String username;
    	public void setUsername(String username) {
    		this.username = username;
    	}
    }
    

    第二种 :创建独立model对象,页面通过ognl表达式封装 (属性驱动)

    页面:

    用户名  <input type="text" name="user.username" />----- 基于OGNL表达式的写法
    

    Action:

    public class RegistAction2 extends ActionSupport {
    	private User user;
    	public void setUser(User user) {
    		this.user = user;
    	}
    
    	public User getUser() {
    		return user;
    	}
    }
    

    使用ModelDriven接口,对请求数据进行封装 (模型驱动 ) ----- 主流

    页面:

    用户名  <input type="text" name="username" /> <br/>  
    

    Action :

    public class RegistAction3 extends ActionSupport implements ModelDriven<User> {
    	private User user = new User(); // 必须手动实例化
    	public User getModel() {
    		return user;
    	}
    }
    

    封装数据到Collection和Map

    1. 封装数据到Collection 对象

    页面

    产品名称 <input type="text" name="products[0].name" /><br/>
    

    Action

    public class ProductAction extends ActionSupport {
    	private List<Product> products;
    	
    	public List<Product> getProducts() {
    		return products;
    	}
    
    	public void setProducts(List<Product> products) {
    		this.products = products;
    	}
    }
    

    2) 封装数据到Map 对象
    页面:

    产品名称 <input type="text" name="map['one'].name" /><br/>  <!-- one是map的键值 -->
    

    Action :

    public class ProductAction2 extends ActionSupport {
    	private Map<String, Product> map;
    
    	public Map<String, Product> getMap() {
    		return map;
    	}
    
    	public void setMap(Map<String, Product> map) {
    		this.map = map;
    	}
    }
    

    请求参数校验

    手工代码校验请求参数

    步骤一: 封装数据
    步骤二: 实现校验Action ,必须继承ActionSupport 类
    步骤三: 覆盖validate方法,完成对Action的业务方法 数据校验通过代码逻辑判断参数是否有效,如果参数非法 , this.addFieldError (ActionSupport提供)workflow拦截器 跳转回 input页面
    步骤四: 在jsp中 通过 s:fieldError 显示错误信息
    validate方法会对Action中所有业务方法进行校验,如果只想校验某一个方法 : validate方法名()

    Xml配置方式数据校验

    位置:xml文件要与action类在同一个包下
    名称:action类名-validation.xml(针对某个方法效验UserAction-regist-validation.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
      		"-//Apache Struts//XWork Validator 1.0.3//EN"
      		"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
    
    <validators>
    	<!-- 对username属性进行校验 -->
    	<field name="username">
    		<!-- 指定username不能为空 -->
    		<field-validator type="requiredstring">
    			<!-- 错误信息 -->
    			<message>用户名不能为空--------</message>
    		</field-validator>
    		<!-- 长度校验,规定用户名必须在6-10位之间 -->
    		<field-validator type="stringlength">
    			<param name="maxLength">10</param>
    			<param name="minLength">6</param>
    			<message>用户名必须在${minLength}-${maxLength}位之间</message>
    		</field-validator>
    	</field>
    
    	<!-- 对age进行校验,规定年龄必须在10-40之间 -->
    	<field name="age">
    		<field-validator type="int">
    			<param name="min">10</param>
    			<param name="max">40</param>
    			<message>年龄必须在${min}--${max}之间</message>
    		</field-validator>
    	</field>
    
    	<!-- 对birthday进行校验 -->
    	<field name="birthday">
    		<field-validator type="date">
    			<param name="min">1974-01-01</param>
    			<param name="max">2004-12-31</param>
    			<message>生日必须在${min}年到${max}年之间</message>
    		</field-validator>
    	</field>
    
    	<!-- 校验邮箱 -->
    	<field name="email">
    		<field-validator type="email">
    			<message>邮箱格式不正确</message>
    		</field-validator>
    	</field>
    
    	<!-- url校验 -->
    
    	<field name="url">
    		<field-validator type="url">
    			<message>url不能这空,类似于http://www.baidu.com</message>
    		</field-validator>
    	</field>
    
    	<!-- 使用正则 -->
    	<field name="telphone">
    		<field-validator type="regex">
    			<param name="regexExpression"><![CDATA[^135[0-9]{8}$]]></param>
    			<message>电话号码必须是135xxxxxxxx</message>
    		</field-validator>
    	</field>
    
    	<field name="repassword">
    		<field-validator type="fieldexpression">
    			<param name="expression"><![CDATA[(password==repassword)]]></param>
    			<message>两次密码输入不一致</message>
    		</field-validator>
    	</field>
    </validators>	
    

    内建校验器

    • required (必填校验器,要求被校验的属性值不能为null)
    • requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)
    • stringlength (字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
    • regex (正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
    • int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
    • double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
    • fieldexpression (字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
    • email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)
    • url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)
    • date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

    Result结果类型

    Action处理请求后, 返回字符串(逻辑视图名), 需要在struts.xml 提供 元素定义结果页面
    1、 局部结果页面 和 全局结果页面

    <action name="result" class="cn.itcast.struts2.demo6.ResultAction">
    	<!-- 局部结果  当前Action使用 -->
    	<result name="success">/demo6/result.jsp</result> 
    </action>
    
    <global-results>
    	<!-- 全局结果 当前包中 所有Action都可以用-->
    	<result name="success">/demo6/result.jsp</result>
    </global-results>
    

    2、 结果页面跳转类型 result标签

    1. name 与action中的method的返回值匹配,进行跳转.
    2. type 作用:是用于定义跳转方式

    dispatcher:它代表的是请求转发,也是默认值。它一般用于从action跳转到页面。
    chain:它也相当于请求转发。它一般情况下用于从一个action跳转到另一个action。

    <!--hello是一个Action的name-->
    <result name="success" type="chain">hello</result>
    

    redirect:它代表的是重定向 它一般用于从action跳转到页面
    redirectAction:它代表的是重定向 它一般用于从action跳转另一个action。

    <result name="success" type="redirectAction">hello</result>
    

    stream:代表的是服务器端返回的是一个流,一般用于下载。

    在jsp中显示错误信息

    <s:fieldError/> 
    <s:fielderror fieldName="">展示特定名称的错误信息.
    

    Struts2国际化

    资源文件编写

    properties文件命名 : 基本名称_语言(小写)_国家(大写).properties
    编写3个property文件

    message.properties

    name=tom
    

    messages_zh_CN.properties //中国中文

    name=汤姆
    

    messages_en_US.properties //美国英文

    name=tom
    

    资源文件作用域

    1.针对于action类
    位置:与action类在同一个包下.
    名称:ActionClassName.properties.
    这个配置文件只对当前action有效。

    2.针对于package下所有action
    位置:在指定的包下
    名称:package.properties

    怎样使用

    1.在action类中使用
    前提:action类要继承ActionSupport类。
    getText(String name)就可以获取配置文件中对应名称的值。

    2.在validation.xml文件中使用

    <message key="名称"/>
    

    3.在jsp页面上使用

    s:text name=“名称” 如果没有使用s:i18n name=""来指定,会从全局配置文件中获取。
    如果要从某一个配置文件中获取,通过name属性来指定, 包名.配置文件名称 .

    	<s:i18n name="cn.itcast.action.package">
      		<s:text name="nameerror"/>
      	</s:i18n>
    

    在struts2中国际化配置文件中使用动态文本

    1.action中怎样使用

    xxxx.property

    msg=hello world  {0}
    

    action

    this.getText("msg",new String[]{"tom"})
    

    结果就是 hello world tom

    2.jsp页面上怎样使用

    xxxx.property
    msg=hello world {0}

    <s:i18n name="cn.itcast.action.I18nDemo1Action">
    	<s:text name="msg">
    		<s:param>张三</s:param>
    	</s:text>
    </s:i18n>
    

    结果就是 hello world 张三

    Struts2拦截器

    struts2中在struts-default.xml文件中声明了所有的拦截器。
    而struts2框架默认使用的是defaultStack这个拦截器栈。
    在这个拦截器栈中使用了18个拦截器。简单说,struts2框架
    在默认情况下,加载了18个拦截器。
    注意:只要显示声明使用了一个拦截器。那么默认的拦截器就不在加载。

    常用struts2 拦截器

    <interceptor-ref name="modelDriven"/> 模型驱动
    <interceptor-ref name="fileUpload"/> 文件上传
    <interceptor-ref name="params"> 参数解析封装 
    <interceptor-ref name="conversionError"/> 类型转换错误
    <interceptor-ref name="validation"> 请求参数校验
    <interceptor-ref name="workflow"> 拦截跳转 input 视图
    

    自定义拦截器

    struts.xml

    <interceptors>
    	<interceptor name="my" class="cn.itcast.intercept.MyInterceptor">
    	</interceptor>
    
    	<interceptor name="bookInterceptor" class="cn.itcast.intercept.BookInterceptor">
    		<param name="includeMethods">add,update,delete</param>
    	</interceptor>
    
    	<interceptor-stack name="myStack">
    		<interceptor-ref name="bookInterceptor"></interceptor-ref>
    		<interceptor-ref name="defaultStack" />
    	</interceptor-stack>
    </interceptors>
    	
    <action name="demo1" class="cn.itcast.action.Demo1Action">
    	<result name="login">/login.jsp</result>
    	<!-- <interceptor-ref name="my" /> <interceptor-ref name="defaultStack"/> -->
    	<interceptor-ref name="myStack" />
    </action>
    

    action

    public class BookInterceptor extends MethodFilterInterceptor {
    
    	@Override
    	protected String doIntercept(ActionInvocation invocation) throws Exception {
    
    		// 1.得到session中的user
    		User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");
    
    		if (user == null) {
    			BookAction action = (BookAction) invocation.getAction(); // 得到当前拦截的action对象。
    			action.addActionError("权限不足,请先登录");// 存储错误信息
    			return Action.LOGIN;
    		}
    		return invocation.invoke();
    	}
    }
    

    OGNL表达式和值栈

    关于valueStack内部结构详解URL
    http://blog.csdn.net/qq32933432/article/details/51568939

    值栈在开发中应用

    主流应用 : 值栈 解决 Action 向 JSP 传递 数据问题

    Action 向JSP 传递数据处理结果 ,结果数据有两种形式

    1) 消息 String类型数据

    this.addFieldError("msg", "字段错误信息");
    this.addActionError("Action全局错误信息");
    this.addActionMessage("Action的消息信息");
    
    • fieldError 针对某一个字段错误信息 (常用于表单校验)、actionError (普通错误信息,不针对某一个字段 登陆失败)、 actionMessage 通用消息

    在jsp中使用 struts2提供标签 显示消息信息

    <s:fielderror fieldName="msg"/>
    <s:actionerror/>
    <s:actionmessage/>
    

    2) 数据 (复杂类型数据)

    使用值栈

    valueStack.push(products);
    

    哪些数据默认会放入到值栈 ???
    1)每次请求,访问Action对象 会被压入值栈 ------- DefaultActionInvocation 的 init方法 stack.push(action);
    * Action如果想传递数据给 JSP,只要将数据保存到成员变量,并且提供get方法就可以了
    2)ModelDriven 接口 有一个单独拦截器

    在拦截器中 ,将model对象 压入了 值栈 stack.push(model);
    * 如果Action 实现ModelDriven接口,值栈默认栈顶对象 就是model对象

    OGNL表达式 常见使用

    、 % 、$ 符号使用

    1) # 的 使用

    用法一 # 代表 ActionContext.getContext() 上下文

      <s:property value="#request.name" />  ------------>  ActionContext().getContext().getRequest().get("name");
    

    request

    session

    application

    attr

    parameters

    用法二 : 不写# 默认在 值栈中root中进行查找

       <s:property value="name" /> 在root中查找name属性 
    
    • 查询元素时,从root的栈顶元素 开始查找, 如果访问指定栈中元素

        <s:property value="[1].name" />  访问栈中第二个元素name属性 
      
    • 访问第二个元素对象

        <s:property value="[1].top" />
      

    用法三 :进行投影映射 (结合复杂对象遍历 )

    1)集合的投影(只输出部分属性

    遍历集合只要name属性

    <s:iterator value="products.{name}" var="pname"> 
    	<s:property value="#pname"/>
    </s:iterator>
    
    2)遍历时,对数据设置条件

    遍历集合只要price大于1500商品

    <s:iterator value="products.{?#this.price>1500}" var="product"> 
    	<s:property value="#product.name"/> --- <s:property value="#product.price"/>	
    </s:iterator>
    
    3)综合

    只显示价格大于1500 商品名称

    <s:iterator value="products.{?#this.price>1500}.{name}" var="pname"> 
    	<s:property value="#pname"/>
    </s:iterator>
    

    用法四: 使用#构造map集合

    经常结合 struts2 标签用来生成 select、checkbox、radio
    使用#构造map集合 遍历

    <s:iterator value="#{'name':'aaa','age':'20', 'hobby':'sport' }" var="entry">
    	key : <s:property value="#entry.key"/> , value:  <s:property value="#entry.value"/> <br/>
    </s:iterator>
    
    1. %的使用

    <s:property value="表达式"> 对于s:property标签,它的value属性会被默认做为ognl.
    用法一: 结合struts2 表单使用, 通过%通知struts, %{}中内容是一个OGNL表达式,进行解析

       <s:textfield name="username" value="%{#request.username}"/>
    

    用法二: 设置ognl表达式不解析 %{‘ognl表达式’}

       <s:property value="%{'#request.username'}"/>
    

    3)$的使用
    用法一 :用于在国际化资源文件中,引用OGNL表达式 在properties文件 msg=欢迎您${#request.username}
    在页面

    <s:i18n name="messages">
    	<s:text name="msg"></s:text>
    </s:i18n>
    * 自动将值栈的username 结合国际化配置信息显示 
    

    用法二 :在Struts 2配置文件中,引用OGNL表达式

    	<!-- 在Action 提供 getContentType方法 -->
    	<param name="contentType">${contentType}</param>
    

    {contentType} 读取值栈中contentType数据,在Action提供 getContentType 因为Action对象会被压入值栈, contentType是Action属性,从值栈获得

    结论: #使用ognl表达式获取数据,% 控制ognl表达式是否解析 ,$ 用于配置文件获取值栈的数据

    使用OGNL访问 对象方法 和 静态方法

    OGNL 在jsp 结合 struts2 标签库 使用 , <s:property value="ognl表达式" /> 执行 ognl表达式
    调用 实例方法 : 对象.方法() ---- <s:property value="'hello,world'.length()"/>
    调用 静态方法 : @[类全名(包括包路径)]@[方法名] — <s:property value="@java.lang.String@format('您好,%s','小明')"/>
    使用 静态方法调用 必须 设置 struts.ognl.allowStaticMethodAccess=true
    #Struts2 防止表单重复提交
    1、 在jsp 通过 <s:token /> 生成令牌号
    生成表单隐藏域
    将令牌号保存到Session

    2、 通过struts2 提供 tokenIntercetor 拦截器 完成请求中令牌号 和 session中令牌号 比较

    <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/> 
    	<action name="token" class="cn.itcast.struts2.TokenAction">
    		<result>/index.jsp</result>
    		<!-- 重新定义拦截器 -->
    		<interceptor-ref name="defaultStack"></interceptor-ref>
    		<interceptor-ref name="token"></interceptor-ref>
    	</action>
    

    3、 当表单重复提交时,token拦截器自动跳转 result name=“invalid.token”
    通过 <s:actionError/> 显示错误信息

    覆盖重复提交信息 struts.messages.invalid.token=您已经重复提交表单,请刷新后重试

    Struts2 内置json插件

    1.导入json插件包

    在struts2的lib包下  struts2-json-plugin-2.3.15.1.jar。
    

    2.在struts.xml文件中配置

    1.<package extends="json-default">
    2.设置视图<result type="json">
    

    这样设置后,会将valueStack栈顶数据变成json。
    对于我们的程序,也就是会将action对象转换成json。

    设置只将指定的数据转json

    <param name="root">p</param> 
    

    如果没有设置,可以理解成将整个action都转换成json的数据。也就是
    在action中提供的getXxx方法,就是json中的一个属性。
    如果设置了root,那么,只将指定数据转换成json.

    怎样设置转换成json的对象中不包含特定的属性?

    1. @JSON(serialize=false) 在getXxx方法上设置
    2. 还可以通过json插件的interceptor完成.
      设置只展示products的name属性
    <param name="includeProperties">products\[\d+\]\.name</param>
    
    展开全文
  • Struts2开发框架

    千人学习 2017-01-02 09:54:12
    本课程主要讲解Struts 2.x开发框架的实现机制以及运行原理分析,同时讲解了Struts 2.x中提供的数据验证、上传、拦截器、转换器等概念,并且针对于拦截器的操作进行了合理的结构设计,以提升代码的可重用性。...
  • Struts2进阶(一)运行原理及搭建步骤

    万次阅读 2015-04-07 14:30:37
    考虑使用到SSH框架中的Struts2。本篇文章只为深入理解Struts2的工作流程,只有在深入理解了其工作流程后,才可以在利用框架编写时做到得心应手。以下是自己的理解及相关的学习知识。若文中技术描述有不当之处,敬请...
  • J2EE进阶(二)从零开始之Struts2

    万次阅读 2016-07-05 10:19:08
    J2EE进阶(二)从零开始之Struts2 以前自己总是听说什么SSH框架,不明觉厉。现在自己要重整旗鼓,开始系统性的学习SSH框架了。首先开始Struts2的学习。其实自己之前参与过Struts2项目的开发。有关Struts2的运行原理,...
  • 深入浅出Struts2

    万人学习 2015-10-17 12:12:18
    本课程主要讲授如何使用Struts2框架开发Web应用程序,其特色在于其讲解的过程中,通过当堂编写代码的讲授方式讲解“关键知识点”,这些“关键知识点”可保证学生从始至终都写出可运行的程序。
  • Struts2学习第一天——struts2基本流程与配置

    万次阅读 多人点赞 2016-06-14 14:48:31
    struts2框架 struts2快速入门 Struts2 处理流程 模仿struts2流程完成入门程序 struts2的流程分析以及工具配置 struts2配置(重点) 1.struts2配置文件加载顺序 2.关于Action的配置 关于常量配置 Action 关于Action类的...
  • struts2的核心和工作原理

    万次阅读 多人点赞 2014-05-30 16:49:59
    在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标  Struts设计的第一目标就是使MVC模式应用于web程序设计。在这儿MVC模式的好处就不在提了。 技术优势  Struts2...
  • SpringMVC与Struts2区别与比较总结

    万次阅读 多人点赞 2015-03-23 21:45:43
    1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的...
  • Struts2 S2-052

    千次阅读 2017-10-25 13:15:39
    Struts2 S2-052影响的版本是Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12。 主要是struts2的rest plugin的XStreamHandler存在问题。 所以,我们在复现此漏洞时,需要引入struts2-core,struts2-rest-...
  • struts1和struts2的区别

    千次阅读 2019-04-18 10:49:02
    下面有关struts1和struts2的区别,描述错误的是? B A Struts1要求Action类继承一个抽象基类。Struts 2 Action类可以实现一个Action接口 B Struts1 Action对象为每一个请求产生一个实例。Struts2 Action是单例...
  • Struts2——(1)Struts2入门

    千次阅读 多人点赞 2013-10-22 23:23:30
    1、Struts2历史,与Struts1的关系  两者的内部基于的原理完全不同,Struts2是基于WebWork发展而来的框架。  两者都是基于MVC实现的框架。  Struts1是Apach推出的。  WebWork是opensyfry推出的。  Strut2是...
  • struts2执行流程

    千次阅读 多人点赞 2018-02-14 20:01:39
    写在前面:struts2在web应用层面属于表示层框架,在MVC开发模式中属于C(Controller控制器),负责对M(Model模型)和V(View视图)进行解耦。struts2是在struts1和webwork的技术基础上进行了合并的全新的框架。...
  • struts2——整合spring与struts2

    千次阅读 2015-10-29 21:33:47
    struts2与spring整合以后,可以在struts中直接使用spring进行bean的配置。换句话说就是让struts2的action由容器管理。
  • Struts2-14.Struts2文件上传下载

    万次阅读 2018-01-06 17:58:20
    Struts2默认采用Common-FileUpload组件来实现文件上传,只是在此基础之后做了一层封装。所以,之前依赖的jar包依然需要 commons-fileupload-1.3.1.jar,commons-io-2.2.jar 首先表单依旧不变 或者 Action:...
  • Struts2学习总结

    万次阅读 2019-04-01 20:30:26
    Struts2轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层。低侵入性,与业务代码的耦合度很低。Struts2实现了MVC,并提供了一系列API,采用模式化方式简化业务开发过程。 1、运行在web层.负责...
  • Struts1 和 Struts2

    万次阅读 多人点赞 2013-03-15 20:46:06
    关于Struts2的出现缘由和好处就不多说啦,看了几篇总结的不错的文章,整理下贴出来,共同学习了。 Action的区别 对于有着丰富的Struts1.x开发经验的朋友来说,都十分的清楚Action是整个Struts框架的核心内容,当然...
  • Struts2-16.Struts2国际化

    万次阅读 2018-01-06 18:24:12
    16.1什么是国际化、本地化 国际化: 国际化(Internationalization,i18n)是程序在不做任何修改的情况下,就可以根据当地的语言和格式习惯显示字符。 本地化: 一个国际化程序,当他运行在...Struts2的国际化依赖于
  • 最新版本的Struts2+Spring4+Hibernate4框架整合

    千次下载 热门讨论 2014-10-15 14:39:34
    整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...
  • 初识Struts2

    千次阅读 2014-11-09 22:41:43
    先简单的写一个小例子: 第一步:在web.xml中加入拦截器配置。... org.apache.struts2.dispatcher.FilterDispatcher filter>  struts2  /*   第二步:把空的struts.xml配置文件放到项目src下面。  
  • K8 Struts2 综合漏洞利用工具 (Apache Struts ...Struts2漏洞检测工具 Struts2漏洞测试工具 K8 struts2 exploit Test Struts2 GetShell 支持漏洞 (S2-045 devMode S2-032 s2-020 s2-019 s2-016 s2-013 s2-009 S2-005)
  • Struts2面试问题

    千次阅读 2018-09-27 19:10:52
    转载自 Struts2面试问题 1.什么是Struts2? Apache Struts2是一个用Java构建Web应用程序的开源框架。Struts2基于OpenSymphony WebWork框架。它从Struts1中得到了很大的改进,使其更加灵活,易于使用和扩展。...
  • 深入理解Struts2

    千次阅读 热门讨论 2016-01-29 10:58:02
    简介 Struts 2Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 142,190
精华内容 56,876
关键字:

struts2