1、Struts2 基础知识Struts2 概述1.Struts2 框架应用 javaee 三层结构中的 web 层框架。2.Struts2 框架在 struts1 和 webwork 基础之上发展的全新框架。3.Struts2 所解决的问题:在以往实现一个功能时,都需要写很多的 servlet,从而造成后期维护上的不方便。图解:4.现在比较稳定的 Struts2 版本struts-2.3.24-all.zip5.web 层常见框架1.struts2.springMVCStruts2 框架入门1.导入 jar 包1.在 lib 里面有 jar 包,但不能全部导入,因为里面含有一些 spring包,
2、是不能使用的,导入会导致程序不能运行。2.到 app 目录里面复制案例的 jar 包是最好的方法。2.创建 action3.配置 action 类的访问路径1.创建 struts2 核心配置文件,该核心配置文件位置和名称是固定的,位置必须在 src 下面,名称为 struts.xml 。2.引入 dtd 约束,可以在案例文件中找到,复制在 struts.xml 文件中即可。3.action 的配置*注意访问路径:http:/域名/端口号/项目名/action 名.action注意:.action 可以省略,但建议不要省略,为了兼容一些老版本的浏览器。4.配置 Struts2 的过滤器,可以在案
3、例中的 web.xml 文件中找到,复制粘贴即可。Struts2 执行过程图解:Struts2 配置Struts2 的核心配置文件1.名称和位置是固定的。2.在配置文件中主要有三个标签,package、action、result,以及各个标签内的其它属性。标签 package1.类似于代码包,区别不同的 action,要配置 action,必须首先写package 标签,在 package 里面才能配置 action 。2.package 标签属性1.name 属性,name 属性的值跟功能本身没有关系的,在一个配置文件中可以写多个 package 标签,但 name 的属性值不能相同。2.e
4、xtends 属性,该属性的值是固定的,在 package 里面配置的类具有action 功能。3.namespace 属性,该属性值和 action 标签里面的 name 的属性值构成访问路径,可以不写,推荐写上,默认为/。标签 action1.action 标签配置 action 访问路径。2.action 标签属性1.name 属性namespace 属性值和 action 标签里面的 name 属性值构成访问路径。在 package 标签里面可以写多个 action 标签,但是 action 的属性name 的值不能够相同。2.class 属性 action 的全路径,即包名+类名3.
5、method 属性比如在 action 里面默认执行的方法是 execute 方法,但是在action 里面写其他的方法,让 action 里面多个方法执行,使用method 进行配置。标签 result1.根据方法的返回值,配置到不同的路径下。2.result 标签属性1.name 属性和 action 中 method 所调用的方法返回值一致。2.type 属性配置如何到路径中(转发/重定向),该属性值的默认是做转发操作。标签 constant1.是一种常量标签2.修改 Struts2 的默认常量值1.常用方式在 struts.xml 中进行配置。2.其它两种方式1.在 src 下面创建
6、struts.properties 文件并修改。2.在 web.xml 文件中进行修改。3.Struts2 最常用的常量struts.il8n.encoding=UTF-8,解决表单在通过 post 方式提交中文时,中文乱码的问题。分模块开发1.单独写配置文件,把配置文件引入到核心配置文件中,从而解决多人操作一个核心文件的问题。2.配置用法在.xml 文件中加入即可。Action 的编写方式1.action 有三种编写方式第一种 创建普通类,这个不继承任何类,不实现任何接口第二种 创建类,实现 Action 接口,实现 execute 方法第三种 创建类,继承 ActionSupport访问
7、action 的方法1.有三种方式访问 action 的方法第一种 使用 action 标签的 method 属性,在这个属性里面写要执行的action 方法。缺陷:action 每个方法都需要配置,如果 action 里面有多个方法,需要配置很多的 action第二种 使用通配符实现(提高代码复用性)在 action 标签中的 name 属性写成”前缀_*” ,method 属性成”1”即可,该*号表示的是 action 方法中的各个方法,而 1 是取name 属性值的第几个*号。第三种 动态访问实现(了解,极少使用)2.注意*1.在 action 里面的方法有返回值,其类型必须为 Stri
8、ng2.action 里面的方法可以没有返回值,没有返回值的时候,action 标签里的 result 标签可以不配置。action 方法设置无返回值的方法有两种,一种是将方法的返回值类型设为 void,另一种是返回一个”none”的字符串。Struts2 笔记(一)1、结果页面的配置(result 标签)1、作用:result 标签配置 action 方法的返回值到不同的路径里面。2、全局页面的使用:当在 result 标签中返回的值和路径是一致的时候,就可使用全局页面。1、配置方法:在 package 标签下配置2、注意:该标签只能在一个 package 标签中使用,如果有多个标签,需要重
9、新定义。3、局部结果页面:指的就是在 action 标签里配置1、配置方法:在 action 标签下配置2、注意:如果既配置了全局,又配置了局部,会以局部为准,全局不起作用。4、type 属性1、作用:如何到路径里面(即定义转发还是重定向)。2、属性值:1、默认值:dispatcher,一般没有写,就是转发操作,浏览器地址栏不会改变。2、重定向:redirect,浏览器地址栏会改变 。3、chain:转发到 action,一般不使用,因为有缓存。4、redirectAction:重定向到 action 。2、使用 Action 获取表单提交的数据1、action 获取表单提交数据的三种主要方式
10、:1、使用 ActionContext 类。1、主要使用的方法:因为该方法是对象方法,所以需要一个 ActionContext 对象来调用,而创建 ActionContext 对象可以使用该类的一个静态方法来创建Comment 元元元1: 2、使用 ServletActionContext类。1、主要使用的方法:3、使用接口注入方法(一般不用)。1、使用步骤:1、实现 ServletRequestAware接口。2、实现该接口的方法。3、在该类中定义一个 HttpServletRequest对象,并赋值。3、在 action中操作域对象1、在 Servlet中三个域对象:request、ses
11、sion、servletContext2、操作三个域对象1、request 对象使用 ServletActionContext类的静态方法 getRequest(),得到该对象。2、session 对象通过第一个知识点获取到 request对象,再通过 request对象获取到该对象。3、servletContext对象通过第一个知识点获取到 request对象,再通过 request对象获取到该对象。4、使用 Struts2封装获取表单数据1、属性封装1、步骤:1、在类里定义私有成员变量,变量名必须和表单中 name的值一致。2、使用 get和 set方法进行封装即可。2、缺点:不能把数据直
12、接封装到实体类的对象里面。2、模型驱动封装1、作用:可以直接把表单数据封装到实体类对象里面。2、操作步骤:1、action 实现接口 ModelDriven2、实现该接口的 getModel方法3、在 action里面创建实体类对象4、注意:表单输入项 name的属性值和实体类属性名称要一致。注意:使用模型封装和属性封装时,在一个 action中,获取表单数据可以属性封装,也可以模型封装,但是不能两个封装同时使用,如果同时使用,只会执行模型封装。3、表达式封装1、作用:可以把表单数据封装到实体类对象里面。2、步骤:1、在 action 类里面声明实体类2、生成实体类变量的 get 和 set
13、方法。3、在表单输入项的 name 属性值里面写表达式形式的数据。3、优点:可以把数据封装到不同的实体类对象里面。5、表单数据封装到集合里面1、封装数据到 List 集合1、操作步骤1、在 action 中声明 List 集合2、生成该集合变量的 get 和 set 方法3、在表单输入项的 name 属性里写表达式2、封装数据到 Map 集合1、操作步骤1、在 action 中声明 Map 集合2、生成该集合变量的 get 和 set 方法3、在表单输入项的 name 属性里写表达式Struts2 笔记(二)1、结果页面的配置(result 标签)1、作用:result 标签配置 action
14、 方法的返回值到不同的路径里面。2、全局页面的使用:当在 result 标签中返回的值和路径是一致的时候,就可使用全局页面。1、配置方法:在 package 标签下配置2、注意:该标签只能在一个 package 标签中使用,如果有多个标签,需要重新定义。3、局部结果页面:指的就是在 action 标签里配置1、配置方法:在 action 标签下配置2、注意:如果既配置了全局,又配置了局部,会以局部为准,全局不起作用。4、type 属性1、作用:如何到路径里面(即定义转发还是重定向)。2、属性值:1、默认值:dispatcher,一般没有写,就是转发操作,浏览器地址栏不会改变。2、重定向:red
15、irect,浏览器地址栏会改变 。3、chain:转发到 action,一般不使用,因为有缓存。4、redirectAction:重定向到 action 。2、使用 Action 获取表单提交的数据1、action 获取表单提交数据的三种主要方式:1、使用 ActionContext 类。1、主要使用的方法:因为该方法是对象方法,所以需要一个 ActionContext 对象来调用,而创建 ActionContext 对象可以使用该类的一个静态方法来创建2、使用 ServletActionContext 类。1、主要使用的方法:3、使用接口注入方法(一般不用)。1、使用步骤:1、实现 Serv
16、letRequestAware 接口。2、实现该接口的方法。3、在该类中定义一个 HttpServletRequest 对象,并赋值。3、在 action 中操作域对象1、在 Servlet 中三个域对象:request、session、servletContext2、操作三个域对象1、request 对象使用 ServletActionContext 类的静态方法 getRequest(),得到该对象。2、session 对象通过第一个知识点获取到 request 对象,再通过 request 对象获取到该对象。3、servletContext 对象通过第一个知识点获取到 request 对
17、象,再通过 request 对象获取到该对象。Comment 元元元2: 4、使用 Struts2封装获取表单数据1、属性封装1、步骤:1、在类里定义私有成员变量,变量名必须和表单中 name的值一致。2、使用 get和 set方法进行封装即可。2、缺点:不能把数据直接封装到实体类的对象里面。2、模型驱动封装1、作用:可以直接把表单数据封装到实体类对象里面。2、操作步骤:1、action 实现接口 ModelDriven2、实现该接口的 getModel方法3、在 action里面创建实体类对象4、注意:表单输入项 name的属性值和实体类属性名称要一致。注意:使用模型封装和属性封装时,在一个
18、 action中,获取表单数据可以属性封装,也可以模型封装,但是不能两个封装同时使用,如果同时使用,只会执行模型封装。3、表达式封装1、作用:可以把表单数据封装到实体类对象里面。2、步骤:1、在 action类里面声明实体类2、生成实体类变量的 get和 set方法。3、在表单输入项的 name属性值里面写表达式形式的数据。3、优点:可以把数据封装到不同的实体类对象里面。5、表单数据封装到集合里面1、封装数据到 List集合1、操作步骤1、在 action中声明 List集合2、生成该集合变量的 get和 set方法3、在表单输入项的 name属性里写表达式2、封装数据到 Map集合1、操作步
19、骤1、在 action中声明 Map集合2、生成该集合变量的 get和 set方法3、在表单输入项的 name属性里写表达式Struts2笔记(三)1、Ognl 概述1、定义:Ognl 是一种表达式,这个表达式的功能比 EL表达式功能更强大。2、功能:1、在 Struts2中可以操作值栈数据。2、一般在 Struts2中和 Struts2标签一起使用操作值栈。3、使用步骤:1、在 lib 文件夹中加入 Ognl 的 jar 包。2、在 jsp 页面中引入 Struts2 标签库。3、使用标签,并给属性 value 设置值,比如求一个字符串的长度案例。2、什么是值栈1、定义:值栈就是 Strut
20、s2 框架中的一种存储机制,类似于域对象,可以存取值。每个 Action 对象里都有一个值栈区域。2、Servlet 和 Action 的区别:Servlet 的实例是在第一次访问时创建的,并且只创建一个实例,属于单例对象。Action 的实例是在第一次访问时创建的,但是每次访问就会创建一个实例,属于多例对象。3、获取值栈步骤:1、获取 ActionContext 对象2、调用 ActionContext 的静态方法 getValueStack()4、值栈的内部结构1、第一部分 root,结构是 list 集合,底层继承自 ArrayList 集合。2、第二部分 context,结构是 Map
21、 集合,底层实现了 Map 接口。3、Struts2 中 debug 标签的使用1、定义:该标签可以查看值栈的结构和存储值。2、使用步骤:访问 action,执行 action 的方法有返回值,配置返回值到jsp 页面,在 jsp 页面中使用该标签,在访问 action,在页面出现一个debug 的超链接,然后点击超链接即可。Struts2 笔记(四)1、在值栈中存放数据1、在值栈中存放数据的三种方式1、首先获取值栈对象,调用值栈对象的 set 方法。2、首先获取值栈对象,调用值栈对象的 push 方法。3、在 action 类中定义一个成员变量,并生成变量的 get 方法。注意:一般第三种方
22、式最常用,因为这种方式是在 action 中存储值,节约资源。然后第一种方式次之,第一种方式极少用到。2、在值栈中取出数据1、取出字符串2、取出集合3、取出对象3、EL 表达式取数据的原理首先去获取 request 域的值,如果该域有值,就直接返回,如果没有值,那么就进入值栈中把值取出来,返回给 request 域对象。4、OGNL 的#、%符号的作用1、#号:使用#号获取 context 里面的数据。使用时格式是#context 的 key名称.域对象名称,如#request.req 。2、%号:可以在 Struts2 标签中使用 OGNL 表达式。5、Struts2 拦截器1、概述:拦截器
23、就是 Struts2 框架中封装的功能的容器。在 Struts2 框架中有很多的功能,所有就有很多的拦截器,并不是每次都执行所有的拦截器,它只会执行一些默认的拦截器。2、默认拦截器的位置3、拦截器的执行时间在 action 对象创建之后,action 的方法执行之前。4、拦截器的原理(两个原理)1、AOP 思想:即面向切面编程,当在基本的功能上扩展其它功能时,不通过改源代码来实现扩展功能的方式。2、责任链模式1、概述:属于 java 设计模式中的一种,和过滤链原理相似。2、过滤链:一个请求可以有多个过滤器进行过滤,只有每个过滤器执行放行操作,该请求才能到下一个过滤器。3、AOP 原理和责任链模
24、式如何应用到拦截器中1、在 action 中并没有执行拦截器的方法,而是用配置文件实现的,这种方法就是使用的 AOP 思想。2、在执行拦截器的过程中,只有每个拦截器执行放行操作后,才能进入到下一个拦截器,这种方法就是责任链模式。6、过滤器和拦截器的区别过滤器:过滤器理论上可以过滤任意内容,如 html、jsp、servlet、图片路径。拦截器:拦截器只能拦截 action 。7、自定义拦截器1、拦截器的结构继承类在接口内的三个抽象方法2、自定义拦截器方法1、写一个类继承 MethodFilterceptor 类2、通过配置文件的方式让拦截器和 action 产生关系1、在要拦截的 action 标签所在的 package 标签里声明拦截器2、在具体的 action 标签里面使用声明的拦截器3、Struts2 里面执行很多默认的拦截器,但是如果在 action 里面配置了自定义拦截器,默认的拦截器就不会执行了,所以要解决。即把默认的拦截器再配置一次注意:这样配置拦截器,对 action 里面的所有方法都会进行拦截。3、配置拦截器对某些方法不进行拦截优点:该方法可以让 action 里面的某个方法不进行拦截。4、解决网页中有网页的问题在标签中设置 target 属性的值为_parent 即可。8、常用的 Struts2 标签