目录

Struts2

Struts2简介

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的更新产品。

常见web层的框架

  • Struts2
  • Struts1
  • Webwork
  • SpringMVC

web框架特点

基本前端控制器模型来设计

  • 浏览器发送的所有的请求,都需要经过前端控制器
  • 前端控制器再根据具体的请求所要实现 的功能,分发到不同的action来处理
  • 所有的分发操作都是框架自动帮你完成的
  • 我们只需要关心数据怎么样处理,封装、接收这些都不用管
  • 其余的操作都是前端控制器来帮你完成

前端控制器

  • 所有的请求都要处理
  • 是通过过滤器来实现的
  • 过滤器当中会有接收数据,封装数据,把所有的东西都帮你处理好,最后到action当中就可以直接使用了

Struts2基本使用

1.下载strusts框架

https://struts.apache.org/

2.目录结构

apps
Struts2提供的应用,war文件:web项目打成war包。直接放入到tomcat可以运行
里面就是一个最简单的一个项目,有strust2所需要的jar包
docs
Struts2的开发文档和API
lib
Strtus2框架的开发的jar包
src
Struts2的源码

3.创建一个web工程

4.引入jar包

5.在工程当中创建一个jsp

在jsp当中写上一个连接,发送一个请求

6.编写Action类

在src当中创建一个普通的类

在类当中提供一个方法,方法名称是固定的

public String execute(){ }

底层会使用反射执行此方法

public String execute(){
System.out.println("我已经接收到了请求");
return null;
}

7.创建Struts配置文件

在src当中创建一个配置文件strust.xml

此文件可以在blank项目的classes目录下找到

8.配置Struts.xml

9.配置前端控制器

  • 没有前端控制器,就没有办法执行action
  • 因为Stusts这些功能都是有前端控制器来给我们提供的
  • 它是有一个过滤器来实现的
  • 所以要去配置一个过滤器

  • 到web.xml当中配置核心过滤器

配置完运行,即可执行到创建的MyAction类中的excute方法

10.在Action当中excute中返回一个Success

11.改写strust.xml,配置页面跳转

Struts2执行流程

  1. 浏览器发送请求至过滤器
  2. 前端核心控制器里有很多拦截器
  3. 加载核心配置文件,寻找对应action里的class
  4. 执行execute方法
  5. 根据返回值跳转页面

Struts2配置

struts2的加载顺序

在struts2当中可以有很多地方可以配置常量
配置的常量,哪一个地方生效,就跟加载顺序有关

配置文件加载顺序

init_DefaultProperties()

加载default.properties

init_TraditionalXmlConfigurations();

加载struts-default.xml、struts-plugin.xml、struts.xml

init_LegacyStrutsProperties();

加载struts.properties

init_CustomConfigurationProviders();

加载配置提供类

init_FilterInitParameters() ;

加载web.xml中过滤器初始化参数

init_AliasStandardObjects() ;

加载Bean对象

配置文件加载顺序

  • default.properties
  • struts-default.xml
  • struts-plugin.xml
  • struts.xml
  • struts.properties
  • web.xml
  • 后配置的常量的值会覆盖先配置的常量的值

Package

包,这个包与Java中的包的概念不一致。
包为了更好管理action的配置
属性
name
包的名称,只有在一个项目中不重名即可。
extends
继承哪个包,通常值为struts-default。
默认我们继承的是Struts-default
在这个包当中,定义了很多结果类型和很多的拦截器,继承了这些东西之后,action才有了这些功能
namespace
namespace+name共同决定了访问路径
名称空间有三种写法
带名称的名称空间
namespace=”/aaa”
根名称空间
namespance=”/”
默认名称空间
namespace=””
abstract
抽象的,用于其他包的继承
现在这个包想被别人继承,设置abstract值为true
设置成abstract后就不能用自己运行了

action

配置Action类。
属性
name
与namespace共同决定访问路径
class
Action类的全路径
method
执行Action中的哪个方法的方法名,默认值execute
converter
用来自定义类型转换器,一般不设置,内部提供的转换器已经够用

常量配置

在Struts2的框架中,提供了非常多的常量
在default.properties
struts.i18n.encoding=UTF-8
Struts2中所有的post请求的中文乱码不用处理。
struts.action.extension=action,,
Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。

在Struts2中修改一些常量的值

在default.properties当中的值是不允许直接修改的
修改常量的值,可以有三个位置进行修正
	struts.xml中进行修改,通过<constant>标签

struts.properties中进行修改,自己新建的, 只能修改常量,基本不使用

web.xml中进行修改,通过过滤器的初始化参数来修改常量

后面的会覆盖前面的内容

include

  • 在一个配置文件当中引入其它的配置文件

  • 以后做团队开发时,很多人都需要去修改配置文件

  • 防止被改乱,可以单独的创建一个配置文件

  • 在主配置文件当中引入创建的配置文件

Action执行访问

Action类写法

1.Action类是POJO的类

自己手动实现execute方法

2.Action类实现一个Action的接口

实现接口时,会让你覆盖execute方法

在此接口当中定义了5个常量(逻辑视图)

String SUCCESS = "success";
成功
String NONE = "none";
没有跳转
String ERROR = "error";
失败
String INPUT = "input";
表单校验时出错
String LOGIN = "login";
登录出错页面跳转

3.Action类继承ActionSupport类(推荐使用此方式)

Actionsupport当中提供了很多功能,数据校验,国际化等一系列操作方法

Action方法

Method访问

使用方法

public String add(){
System.out.println("添加");
return null;
}
public String delete(){
System.out.println("删除");
return null;
}
public String update(){
System.out.println("修改");
return null;
}
public String find(){
System.out.println("查找");
return null;
}
弊端
要写多个action标签

通配符

要求
访问路径当中要包含执行的方法
使用通配符调用方法时,内部会验证是否允许访问该方法,所以要在Action中加上
<allowed-methods>delete,update,insert,select</allowed-methods>
goods_*        method="{1}"    其中1为第一个*的内容
*_* class="com.myxq.struts.{1}" method={2}
使用方法

动态方法访问

要求
  • 默认是关闭状态,要想使用的话,必须得要通过修改常量来打开

  • 使用通配符调用方法时,内部会验证是否允许访问该方法,所以要在Action中加上

<allowed-methods>delete,update,insert,select</allowed-methods>
使用方法

ServletAPI

Struts中API介绍

  • 在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的。
  • 在实际开发中,经常使用到Servlet的API。
  • 比如进行登录,将用户的信息保存到Session中,有的时候需要向页面输出一些内容,用到response对象。
  • 涉及到Servlet的API的访问。

如何获得到servlet中的API

完全解耦合的方式

使用ActionContext来进行获取

注意

​ 此方法只能从域中取数据和保存数据

​ 不能获取其它的方法

使用步骤

示例表单

<form >
用户名:<input type="text" placeholder="请输入用户名..." name="username"><br/>
昵称:<input type="text" placeholder="请输入用户名..." name="nick"><br/>
爱 好: <input type="checkbox" value="足球" name="hobby">足球
<input type="checkbox" value="篮球" name="hobby">篮球
<input type="checkbox" value="乒乓球" name="hobby">乒乓球<br/>
<input type="submit" value="提交">
</form>
使用Servlet的API的原生方式

servletActionContext

这种方式可以操作域对象的数据,同时也可以获得对象的方法。

使用步骤

接口注入的方式

让Action实现一些接口,让接口提供的一些方法,设置一些具体的值

使用步骤

结果页配置

全局配置

全局结果页面

​ 全局结果页面指的是,在包中配置一次,其他的在这个包中的所有的action只要返回了这个值,都可以跳转到这个页面。

使用场景

​ 有些功能需要用户登录才能使用,只要没有登录,就让它返回到登录页面,很多地方都要返回到登录,所以可以把登录页做为一个全局的

使用方法

局部配置

局部结果页面

​ 局部结果页面指的是,只能在当前的action中的配置有效

使用方法

注意点

​ 全局和局部名称相同时,会优先找局部

接收参数

当发送一个请求时,除了使用requestApi来接收参数之外,Struts2内部提供了3种 接收参数的方式

接收参数的方式

1.提供属性set方法的方式

在Action当中提供对应属性的set方法,会自动接收参数,并且会自动做类型转换

使用方式

缺点

​ 接收少量数据可以,如果大量数据,还得要自己手动封装成对象

2.页面中提供表达式方式

  • 创建一个接收参数的domain模型
  • 在Action当中提供一个对象属性,并要提供该对象属性的get/set方法
  • 在jsp页面当中发送参数时要带上Action当中的对象属性名称

使用方式

3.采用模型驱动方式

  • 创建一个接收参数的domain模型
  • 在Action当中实现ModelDriven接口
  • 实现接口方法getModel()
  • 创建一个模型对象,在接口方法中返回

使用方式

接收参数错误

  • 只要任何一个拦截器在执行的过程当中,都可以向错误信息中添加错误消息。
  • 最后workflow会检查错误信息当中是否有错误的消息
  • 如果没有,就直接到目标action
  • 如果有,就会跳转到input逻辑视图

在开发时,可以配置一个input逻辑视图,错误时,可以在跳转到自己指定的页面, 在页面中可以显示错误信息

接收复杂类型封装到List集合

  • 创建jsp页面

  • 创建页面对象模型

  • 创建对应Action

  • 在jsp当中添加表达式

接收复杂类型封装到Map集合

key值为自己取的一个值

Struts2的拦截器

值栈

什么是值栈

ValueStack实际上就是一个容器
是一个接口,实现类为OgnlValueStack
当用户每次访问action对象的业务方法时, 会先创建ActionContext对象
、OgnlValueStack对象、Action对象
它由Struts框架创建,当前端页面如jsp发送一个请求时,
Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。
Struts框架中的数据就都保存到了ValueStack中,不存到域当中了
存到域当中只能在页面中把它取出来
存到值栈当中可以在任何地方取出数据
页面中取出
action中取出
在配置文件当中取出
ValueStack贯穿整个action的生命周期
action一旦创建,就会创建一个valuestack对象

值栈的内部结构

值栈与ActionContext的关系

可以通过ActionContext获得到值栈

ActionContext上下文对象

  • 当请求过来的时候,执行StrutsPrepareAndExecuteFilter过滤器当中的doFilter方法
  • 在这个方法当中创建ActionContext
  • 在创建ActionContext过程中,创建ValueStack对象
  • 将valueStack对象传递给ActionContext对象。
  • 通过ActionContext获取值栈对象
  • ActionContext对象之所以以够访问servlet的API(域对象的数据),就是因为内部有值栈的引用

三大框架 之 Struts2的更多相关文章

  1. Java_Web三大框架之Struts2

    今天正式接触Java_Web三大框架之Struts2框架.对于初学者来说,先来了解什么是框架技术: 一.“框架技术”帮我们更快更好地构建程序: 1.是一个应用程序的半成品 2.提供可重用的公共结构 3 ...

  2. 三大框架SSH(struts2+spring+hibernate)整合时相关配置文件的模板

    最近在学SSH三大框架的整合,在此对他们整合时相关配置文件做一简单的模板总结,方便以后复用! 首先是web.xml配置文件,这里面就配置一些简单的监听器.过滤器,包括spring核心配置文件appli ...

  3. java三大框架SSH(Struts2 Spring Hibernate)

    http://www.cnblogs.com/qiuzhongyang/p/3874149.html

  4. 框架: Struts2 讲解 1

    一.框架概述 1.框架的意义与作用: 所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的经历放到业务需求的分析和理解上面. 特点:封装了很多细节,程序员在使用的时候会非常简单. 2 ...

  5. java 的 struts2 Spring Hibernate 三大框架的整合

    原理就不说了,直接上配置文件及代码,用来备用 首先,将三大框架所需要的jar包导入项目中 导入  struts2-spring-plugin-2.3.3.jar包  此包的作用是作为struts2 与 ...

  6. Struts2+Spring+Hibernate 三大框架的合并集成

    这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样.  首先看一 ...

  7. struts2.1.8+hibernate2.5.6+spring3.0(ssh2三大框架)常见异常原因和解决方案

    ---------------------------------------------------------------------------------------------------- ...

  8. 最新版本的Struts2+Spring4+Hibernate4三大框架整合(截止2014-10-15,提供源码下载)

    一. 项目名称:S2316S411H436 项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 + Quartz2.2.1 源代码下载地址: 基本版:ht ...

  9. (转)hibernate-5.0.7+struts-2.3.24+spring-4.2.4三大框架整合

    http://blog.csdn.net/yerenyuan_pku/article/details/70040220 SSH框架整合思想 三大框架应用在JavaEE三层结构,每一层都用到了不同的框架 ...

随机推荐

  1. 安装License需要重启

    "only commands for license handling are allowed in current state" Can you confirm if licen ...

  2. python多线程爆破压缩包密码

    import zipfile from threading import Thread #多线程库 import optparse #选定字典或者文件 def extractFile(zfile,pa ...

  3. iOS 静态、全局变量、常量

    关键字static 两个概念:生命周期.作用域生命周期:这个变量能存活多久,它所占用的内存什么时候分配,什么时候收回.作用域:这个变量在什么区域是可见的,可以拿来用的. static分两种情况:修饰局 ...

  4. 如何在Hybris commerce里创建一个media对象

    进入backoffice的Media中心, 首先新建一个文件夹,用于存放即将创建的media对象: 取名为jerryimage: 然后创建一个新的media对象,取名jerryproductimage ...

  5. Linux网卡上添加多个IP

    1.查看现有网卡ip addr show看到ens_xxx 2.进入网卡配置项cd /etc/sysconfig/network-scripts/vim ifcfg-ens192末尾添加2行:IPAD ...

  6. MySQL Connection--使用tcpkill杀掉MySQL活跃连接

    当MySQL连接被打满,连管理员也无法本地登录时,可以考虑使用tcpkill杀掉一些应用服务器创建的连接. CentOS 6安装tcpkill rpm安装包: libnids-1.24-1.el6.x ...

  7. Linux磁盘管理——日志文件系统与数据一致性

    参考:Linux磁盘管理——Ext2文件系统 数据不一致 上图是Ext2结构图,其他FS结构类似. 一般来说,我们将 inode table 与 data block 称为数据区:至于其他例如 sup ...

  8. sqlite3入门之sqlite3_get_table,sqlite3_free_table

    sqlite3_get_table sqlite3_get_table函数原型: int sqlite3_get_table( sqlite3 *db, /* An open database */ ...

  9. Spring -10 -<bean>的 scope 属性 -singleton 默认值/prototype 多例 /request /session /application /global session

    1.<bean>的属性; 2.作用:控制对象有效范围(单例,多例等)3.<bean/>标签对应的对象默认是单例的. 3.1无论获取多少次,都是同一个对象 Teacher t1 ...

  10. 神经网络(12)--具体实现:如何对back propagation的正确性进行验证

    我们在进行back propagation时难免会出现各种各样的问题,当出现问题的时候,我们的cost function仍然是随着迭代的次数下降的,但是这中间会有一些问题存在,那么我们如何来检查我们的 ...