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>
阅读全文
2 0
- [Struts2]Struts2学习总结
- 【Struts2框架】Struts2总结
- 【Struts2】Struts2要点总结
- struts2 总结
- Struts2总结
- struts2总结
- Struts2总结
- struts2总结
- struts2总结
- Struts2总结
- Struts2总结
- struts2 总结
- struts2总结
- struts2总结
- Struts2总结
- STRUTS2总结
- struts2 总结
- struts2总结
- POJ-2524 Ubiquitous Religions【并查集】
- git 分之管理---创建与合并分支
- 服务计算——配置go语言环境
- Oracle 数据库基础练习
- 几秒出现数据(图片)和时间
- struts2总结
- 自动轮播适配器
- RTU安卓开发
- 线段树+差分——【模板】树状数组2
- [深度学习]CNN的基础结构与核心思想
- MYSQL性能优化
- idea下被svn版本控制各类文件的颜色区分
- 自动轮播绘制小黑点
- Codeforces 522 A. Reposts 树形DP