struts2总结

来源:互联网 发布:反映网络暴力的美剧 编辑:程序博客网 时间:2024/06/09 17:46

刚学完struts2 跟着视频做的总结,希望对各位有所帮助!

struts2第一天



1.struts2概述


2.struts2入门案例


3.struts2底层执行过程


4.struts2相关配置


5.struts2的action创建


6.struts2的action方法访问


*********************************


struts2概述
1.struts2框架应用javaee三层结构中web层框架


2.struts2框架在struts1和webword基础之上发展全新的框架


3.struts2解决的问题
如果功能很多,创建很多的servlet,造成维护特别不方便


4.struts2版本
struts-2.3.24-all.zip


5.web层常见框架
*1.struts2 
*2.springMVC



struts2框架入门案例


第一步 导入jar包
*1.在lib中有jar包,不能把所有jar包都导入项目中
*2.在apps目录里面,找到示例程序,从实例程序找jar包


第二步 创建action


第三步 配置action类访问路径
*1.创建struts2核心配置文件
核心配置文件名称和位置是个固定的
位置必须在src下面,名称struts.xml


*2.引入dtd约束
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">


*3.action的配置
*访问路径
http://127.0.0.1/struts2day1/hello.action


反射:
Class clazz=Class.forName("action全路径");
//得到名称是execute的方法
Method m = clazz.getMethod("execute");
//方法执行
Object obj = m.invoke();


查看源代码
class StrutsPrepareAndExecuteFilter implements StrutsStatics,Filter


1.过滤器在服务器启动时候创建,创建过滤器时候执行init方法
*1.在init方法中主要加载配置文件
包含自己创建的配置文件和struts2自带的配置文件
**struts.xml
**web.xml




struts2相关配置


struts2的核心配置文件
*1.名称和位置固定,位置在src下


*2.在配置文件中主要三个标签package、action、result、标签里面的属性


标签package
*1.类似于代码包,区别不同的action,要配置action,必须先写package标签,
在package里面才能配置action

*2.package标签属性
*1.name属性
name属性的值跟功能本身没有关系的
在一个配置文件中可以写多个package标签,name属性值不能相同

*2.extends属性
extends="struts-default"
属性值固定的,struts-default
写了这个属性之后,在package里面配置的类具有action功能

*3.namespace属性
namespace属性值和action标签里面的name属性值构成访问路径
namespace="/" name="action" 构成http//..../action
默认不写就代表杠

标签action
*1.action标签配置访问路径

*2.action标签属性
*1.name属性
namespace属性值和action标签里面的name属性值构成访问路径
在package标签里面写多个action标签,但是action的name属性值不能
相同的

*2.class属性
action全路径

*3.method属性
比如在action里面默认执行的方法execute方法但是在action里面写其他方法
让action里面多个方法执行,使用method进行配置,
标签result
*1.根据action的方法返回值,配置到不同的路径里面

*2.result标签属性
*1.name属性
和方法的返回值一样
<result name="ok">/hello.jsp</result>
其中/代表跟路径或项目路径

*2.type属性
配置入河道路径中(转发或者重定向)
type属性默认值,做转发操作



修改struts2默认常量值
*1.常用的方式
在struts.xml中进行配置
<constant name="struts.i18n.encoding" value="UTF-8"></constant>

*2.还有两种方式(了解)
在src下面创建struts.properties,进行修改
在web.xml进行配置


介绍最常用常量
struts.i18n.encoding=UTF-8
*1.表单提交数据到action里面,在action中可以获取表单提交数据
*2.表单提交数据有中文,有乱码问题,解决:
post提交直接设置编码
get提交做编码转换
*3.如果在action获取表单通过post发那个是提交中文,中文乱码问题
帮解决了,不需要我们自己处理问题

分模块开发
*1.单独写配置文件,把配置文件引入到核心配置文件中
<!-- 引入hello.xml文件 -->
<include file="cn/action/hello.xml"></include>


Action编写方式
*1.action编写有三种方式
第一种 创建普通类,这个不继承任何类,不是先任何接口
public class HelloAction{}

第二种 创建类,实现接口Action接口(不常用)
public class UserAction implements Action{}

第三种 创建类,继承类ActionSupport(一般使用)
public class BookAction extends ActionSupport {}


访问action的方法(重点)
*1.有三种发那个是实现
第一种 使用action标签的method属性,在这个属性里面写执行
action的方法


第二种 使用通配符方式实现

第三种 动态访问实现(不用)

在action里面的方法有返回值,如果有返回值时候类型必须是String

action里面的方法可以没有返回值,没有返回值的时候,
在result标签不用需要配置,让返回值返回“NONE”


使用通配符实现(重点)
*1.在action标签里面name属性,name属性值里面写符号* 星号
*比配任意内容
比如访问hello,*可以匹配到
比如访问add,*可以匹配到



struts2第二天



1.结果页面配置
*1.全局结构页面
*2.局部结果页面
*3.result标签type属性


2.在action获取表单提交数据
*1.使用ActionContext类获取
*2.使用ServletActionContext类获取
*3.使用接口注入方式获取
3.struts2提供获取表单数据方式
*1.属性封装
*2.模型驱动封装


4.struts2获取表单数据封装到集合中
*1.封装到list集合
*2.封装到map集合

5.扩展-表达式封装和模型驱动比较


6.案例-添加客户功能


结果页面的配置
*1.result标签配置action方法的返回值到不同的路径里面

*2.创建两个action,执行默认的方法execute方法,让
两个action的方法都返回success,配置到同一个页面里面


如果多个action,方法里面返回值相同的,到页面也是相同的,
这时候可以使用全局结果页面配置


局部结果页面
*当配置了全局,又有局部,以局部的为准


result标签的type属性
*1.result标签里面除了name属性之外,还有一个属性type属性
*type属性:如何到路径里面(转发还是重定向)

*2.type属性值
*默认值,做转发操作,值是dispatcher

*做重定向操作,值是redirect




action获取表单提交数据
*1.之前web阶段,提交表单到servlet里面,在servlet里面使
用request对象里面的方法获取,getParameter,getParameterMap

*2.提交表单到action中,但action中没有request对象,不能直接
使用request对象

*3.action获取表单提交数据主要三种方式
*1.使用ActionContext类获取
*2.使用ServletActionContext类
*3.使用接口注入方式


使用actionContext类获取
*1.因为方法不是静态的方法,需要创建ActionContext类的对象

*2.这个ActionContext类对象不是new出来的,

使用接口注入 
*1.让action实现接口,为了得到request对象


在action里面操作域对象
*1.request、session、servletContext




struts2封装获取表单数据方式


使用原始发那个是获取表单封装到实体类对象


属性封装
*1.直接把表单提交属性封装到action的属性里面

*2.实现步骤
*在action成员变量位置定义变量
变量名称和表单输入项的name属性值一样

*生成变量的set方法(set和get方法)

使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类李曼

模型驱动封装(重点*******)
*1.使用模型驱动封装,可以直接把表单数据封装到实体类对象里面


*2.实现步骤
*1.action实现接口ModelDriven
*2.实现接口里面的方法getModel方法
把创建对象返回
*3.在action里面创建实体类对象

*3.使用模型驱动和属性封装注意问题:
*在一个action中,获取表单数据可以属性封装,使用模型
驱动封装,,不能同时使用属性封装和模型驱动封装获取
同一个表单数据


表达式封装(会用)
*1.实现过程
*使用表达式封装可以把表单数据封装到实体类对象里面

第一步 在action里面声明实体类

第二步 生成实体类变量的set和get方法

第三步 在表单输入项的name属性值里面写表达式形式



比较表达式封装和模型驱动封装
*1.使用表达式封装和模型驱动封装都可以把数据封装到实体
类对象里面


*2.不同点:
*1.使用模型驱动只能把数据封装到一个实体类对象里面
在一个action里面不能使用模型驱动把数据发呢工作到不同的实体类对象

*2.使用表达式封装可以把数据封装到不同的实体类对象里面




封装到集合里面






=================================










struts2第三天



1.ognl概述


2.ognl入门案例


3.什么是值栈
*1.servlet和action区别
*2值栈的储存位置

4.如何获取值栈对象


5.值栈内部结构


6.向值栈放数据
*1.s:debug标签
*2.向值栈放字符串
*3.向值栈放对象
*4.向值栈放list集合


7.从值栈获取数据
*1.从值栈获取字符串
*2.从值栈获取对象
*3.从值栈获取list集合

8.EL表达式获取值栈数据


9.ognl表达式#、%使用



OGNL概述
struts2默认的表达式语言就是OGNL。
1.之前web阶段,学习过El表达式,EL表达式在jsp中获取域对象中的值


2.OGNL是一种表达式,这个表达式功能更加强大,
*1.在struts2里面操作值栈数据

*2.一般把ognl在struts2操作:和struts2标签一起使用操作值栈

3.OGNL不是struts2的一部分,单独的项目,经常和struts一起使用
*1.使用ognl时候首先导入jar包,struts2提供jar包

使用jstl时候,导入jar包之外,在jsp页面中引入标签库使用struts2标签
时候,在jsp页面中引入标签库
<%@ taglib uri="/struts-tags" prefix="s"%>


<s:property value="'haha'.lenght()"/>
结果页面会显示一个4


什么是值栈
1.之前在web阶段,在servlet里面进行操作,把数据放到域对象里面,
在页面使用EL表达式获取到,域对象在一定范围内,存值和取值


2.在struts2里面提供本身一种存储机制,类似于域对象,是值栈,可以存值取值
*在action里面把数据放在值栈里面,在页面中获取到值栈数据


3.servlet和action区别
*1.Servlet:默认在第一次访问时候创建,创建一次,单实例对象
*2.Action:访问时候创建,每次访问action时候,都会创建action对象,
创建多次,多实例对象。

4.值栈存储位置
*1.每次访问action时候,都会创建action对象
*2.在每个action对象里面都会有一个值栈对象(只有一个)


获取值栈对象
1.获取值栈对象有多种方式
*1.使用actionContext类里面的发那个发得到值栈对象。
ActionContext context =ActionCOntext.getContext();
//调用值栈对象
ValueStack stack1=context.getValueStack();
ValueStack stack2=context.getValueStack();
System.out.println(stack1==stack2);





栈的特点:先进后出,最上边叫栈顶元素,往上面加,叫做加栈




值栈内部结构


1.值栈分为两部分
第一部分root,结构是list集合

第二部分 context结构 map集合


key固定          value
request          request对象引用
session          HttpSession对象引用
application      ServletContext对象引用
parameters       传递相关参数
attr             






s:debug使用这个标签可以查看纸扎结果和存储值


向值栈放数据
1.向值栈放数据多种方式
第一种 获取值栈对象,调用值栈对象里面的set方法
//1获取对象
ActionContext context=ActionContext.getContext();
ValueStack stack=context.getValueStack();
//2.调用方法set方法
stack.set("username","itcastitheima");


第二种 获取值栈对象,调用值栈对象里面的push方法
//3.调用方法push方法
stack.push("abcd");

第三种 在action定义变量,生成变量的get方法(最常用)




向值栈放对象
1.实现步骤
第一步 定义对象变量

第二步 生成变量的get方法(最常用)

第三步 在执行的方法里面向对象中设置值




向值栈放list集合
第一步 定义list集合变量

第二步 生成变量的get方法

第三步 在执行的方法里面向list集合设置值




从值栈中获取数据
1.使用struts2的标签+ognl表达式获取值栈数据
*1.<s:property value="ognl表达式"/>



获取字符串
1.向值栈中放入字符串
//获取字符串的值
<s:property value="username"/>


//获取对象的值:
<s:property value="user.username"/>
<s:property value="user.=password"/>
<s:property value="user.address"/>


//获取值栈list集合数据
其中<!-- 这种注释对<s:iterator>标签没有作用,但可以使用<%%>进行注释-->
第一种
<s:property value="list[0].username"/>
<s:property value="list[0].password"/>
<s:property value="list[0].address"/>
第二种
使用struts2标签类似jstl的foreach标签
<s:iterator>:遍历值栈的list集合
<s:itertor value="list">
<!--遍历list得到list里面每个User对象-->
<s:property value="username"/>
<s:property value="password"/>
<s:property value="address"/>
</s:iterator>
第三种
<s:itertor value="list" var="user">
<s:property value="#user.username"/>
<s:property value="#user.password"/>
<s:property value="#user.address"/>
</s:iterator>


<s:debug></s:debug>
获取对象


获取list集合


其中<!-- <s:iterator:></s:iterator> --> 不能注释这个标签
否则会报错,但是可以用<!%%>这样注释

其他操作
1.使用set方法向值栈放数据,获取
<s:property value="username"/>


2.使用push发那个发向值栈放数据,获取
使用push方法设置值,没有名称,只有设置的值
向值栈放数据,把向值栈放数据存到数组里面,数组的名称top,
根据数组获取值(了解)
<s:property value="[0].top"/>//意思是去到数组中的第一个值


使用foreach标签+el表达式获取值栈list集合数据
<%@ taglib uri="" prefix="c"%>
<c:forEach items="${list}" var="" >
${user.username}
${user.password}
${user.address}
</c:forEach>


El表达式获取值栈数据(为什么)
1.EL表达式获取域对象值


2.向域对象里面放值使用setAttrubute方法,获取值使用getAttribute方法


3.底层增强request对象里面的方法getAttribute方法






OGNL的#、%的使用
#使用
1.使用#获取context里面属性
<s:property value="#request.req"/>


%使用
1.在struts2标签中表单标签
*在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用
ognl表达式不识别,只有%之后才会识别。
%{#request.req}


++++++++++++++++++++++++++++++++++++++++++++++++
================================================
++++++++++++++++++++++++++++++++++++++++++++++++


struts2第四天



struts2拦截器概述
只有struts2里面有个,其他里面没有
1.struts2是框架,封装了很多功能都是在拦截器里面


2.struts2里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行
每次执行默认的拦截器 


3.struts2里面默认拦截器位置
在struts2-core-2.3.24.jar下面的
struts-default.xml中


4.拦截器在什么时候执行?
*1.在action对象创建,方法执行之前执行




拦截器底层远离
1.拦截器底层使用两个原理
*1.aop思想
*1.文字描述:
Aop是面向切面(方面)编程,有基本功能,扩展功能,不通过修改源代码
的方式扩展功能。
*2.画图:
*2.责任链模式
*1.在java中有很多的设计模式,责任链模式是其中的一种

*2.责任链模式和过滤链很相似

责任链模式:
要执行多个操作,又添加、修改、删除三个操作。
首先执行添加操作,添加操作执行之后做类似于放行的操作,执行修改操作,
修改操作执行之后做放行操作,执行删除操作

过滤链:一个请求可有多个过滤器进行过滤,每个过器只有做放行才能到
下一个过滤器

aop思想和责任链模式如何应用到拦截器里面?
*1.文字描述:
拦截器在action对象创建之后,action的方法执行之前执行默认拦截器,
执行过程使用aop思想,在action中没有直接调用拦截器的方法,
使用配置文件进行操作

在执行拦截器时候,执行很多的拦截器,这个过程使用责任链模式

假如执行三个拦截器,执行拦截器1,然后放行,执行2拦截器然后放行,
然后执行3拦截器,放行,执行action的方法

执行action
创建action对象,使用动态代理方式

重要的概念
**1.过滤器和拦截器的区别
*1.过滤器:落去理论上可以任意内容,比如html、jsp、servlet、图片路径

*2.拦截器:拦截器只拦截action








**2.Servlet和action区别
*1.serlet默认第一次访问时候创建,创建一次,单实例对象

*2.action每次访问时候创建,创建多次,多实例对象




自定义拦截器
1.在struts2里面有很多的拦截器,这些拦截器是struts2封装的功能,但是在实际
开发中struts2里面的拦截器中可以没有要好似用的功能,这个时候需要自己写拦截器实现功能


2.拦截器结构


ctrl +shift+T 进入源代码中


自定义登录拦截器


*1.判断是否登录:判断session里面是否有名称是username的值
*2.拦截器实现过程
第一步 创建类,继承MethodFilterInterceptor类
第二步 重新MethodFilterInterceptor类里面的方法写拦截器逻辑
第三步 配置action和拦截器关系(注册拦截器)
*1.在要拦截的action标签所在的package标签里面声明拦截器
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="loginintercept" class="cn.action.LoginInterceptor"></interceptor>
</interceptors>

*2.在具体的action标签使用声明的拦截器
<!-- 2.使用自定义拦截器 -->
<interceptor-ref name="loginintercept"></interceptor-ref>


*3.struts2里面执行很多默认拦截器,但是如果在action里
面配置自定义拦截器:默认拦截器不会执行了
解决:把默认拦截器
<!-- 3.把默认拦截器手动使用一次 -->
<interceptor-ref name="defaultStack"></interceptor-ref>


*4.配置的拦截器会对action里的所有方法都拦截

*5.配置拦截器,对action里面所有的发那个发都惊喜拦截
*1.在action里面有login的登陆的方法,这个方法不需要拦截,如果
这个方法都要拦截,永远登录不进去了,

*2.解决:让login方法不进行拦截
直接通过配置,让action中的某些方法不进行拦截
<param name="excludeMethods">execute,login</param>
<!-- 1.声明拦截器 -->
<interceptors>
<interceptor name="loginintercept" class="cn.action.LoginInterceptor"></interceptor>
</interceptors>

<action name="userAction" class="cn.action.UserAction">

<!-- 2.使用自定义拦截器 -->
<interceptor-ref name="loginintercept">
<!-- 配置action里面某些方法不尽兴拦截
name属性值:excludeMethods
值:action不拦截的方法名称
-->
<param name="excludeMethods">execute,login</param>
</interceptor-ref>
<!-- 3.把默认拦截器手动使用一次 -->
<interceptor-ref name="defaultStack"></interceptor-ref>

<result name="login">/login.jsp</result>
<result name="loginsuccess">/user.jsp</result>
</action>
设置打开位置,在form标签里面

struts2标签
1.s:property:和ogbl表达式在jsp页面中获取值栈数据


2.s:iterator:获取值栈list集合数据,表示list集合


3.s:debug标签:查看值栈结构和数据


struts2表单标签
1.html表单标签
1.form :action method enctype(上传时用)
2.输入项
打不过在input里面封装type=“值”
text:普通输入项
password:密码输入项
radio:单选输入项
checkbox:复选输入项
file:文件上传项
hidden:隐藏项
button:普通按钮
submit:提交按钮
image:图片按钮
reset:重置

select:下拉输入项
textarea:文本域

2.在struts2里面对应html表单大部分都有
<%@ taglib uri="/struts-tags" prefix="s"%>
<s:form theme="simple">//theme="simple" 如果用这个标签,则所有的都会变成一行
<s:textfield name="demo" label="username" value="username"></s:textfield>
<s:password name="password" label="mima"></s:password>
<s:redio list="{'女','男'}" name="sex" label="性别"></s:radio>
<s:redio list="#{'nv':'女','nan':'男'}" name="sex1" label="性别"></s:radio>
<s:checkboxlist list="{'chi','shui','qiao'}" name="love" label="爱好"></s:checkboxlist>
<s:select list="{'chi','shui','qiao'}" name="love1" label="爱好"></s:checkboxlist>
<s:file name="file" label="上传文件"></s:file>
<s:hidden name="hid" value="abcd"></s:hidden>
<s:submit value="提交"></s:submit>
<s:reset value="重置" ></s:reset>
<s:textarea rows="4" cols="4" name="resune" label="简历"></s:textarea>
</s:form>
原创粉丝点击