https://www.yiibai.com/struts_2/struts_value_stack_ognl.html
如上学习Struts2的网站
action中的类必须遵守的规则
1.必须有Public
2.必须有返回值,必须是字符串
3.方法的名称不能有参数
1.struts2常量的三种配置方式 ___ P15-16页
①在struts.xml文件中使用<constant>
元素配置常量
②在struts.properties 文件中配置常量
③在web.xml文件中通过<init-param>
元素配置常量
2.Action的配置 ___ P20页
2.2.1实现Action的控制类
1.POJO的实现
2.实现Action接口(让用户开发的Action更规范)
3.继承ActionSupport类
2.2 .2配置Action
在struts.xml文件中通过<action>
元素对请求的Action进行配合
<package name="a1" namespace="/" extends="struts-default">
<action name="fileUpload1" class="com.zte.FileUploadAction" method="execute">
<result name="success">/fileUploadSuc.jsp</result>
</action>
2.2.3使用通配符 __P21
3.Action访问Servlet API(重要) __P22
1.通过ActionContext类访问 __P23
ActionContext context=ActionContext.getContext();
context.put("name","itcast");//放入到request对象之中
context.getApplication().put(key, value)//放入到application对象之中
context.getSession().put(key, value)//放入到session对象中
2.通过特定的接口方式__P27
3.通过ServletActionContext来访问__P29
通过图来看可以获取到那些对象
获取request
HttpServletRequest request=ServletActionContext.getRequest();
获取session
ServletActionContext.getRequest().getSession()
ActionContext.getContext().getSession();
这个方法获取的session是struts封装过的一个Map类型的session,只能调用put()方法缓存数据。
ServletActionContext.getRequest().getSession();
这个方法获取的session是原生的session,可以调用setAttribute()方法。
4.结果的返回类型
<action name="download" class="com.zte.DownloadAction" method="execute">
<result type="stream"><!--指定类型-->
<param name="inputName">downloadFile</param>
</result>
</action>
在result中指定哪种返回类型详细看,这里的stream通常用来处理文件的下载,还可用于Ajax数据__P35(重要的表格),这里默认的type是dispatcher 转发页面,通常处理jsp,属于服务器端转发。
5.Struts2的拦截器__P40
流程
1.拦截器的生命周期
1.启动服务器时候,申明在配置文件的拦截器,被初始化,调用init方法
2.当有请求访问拦截器作用的action时,先创建action对象,
3.执行该拦截器的intercepot方法拦截。在action目标方法 invocation.invoke()执行前后,写相应的业务逻辑。
4.当服务器停止时,拦截器对象才被销毁
2.如何配置自定义的拦截器
拦截器:拦截器类似于过滤器的功能,过滤器可以过滤项目的任何请求(servlet/jsp/html/img),拦截器只能拦截Action请求。
定义拦截器interceptor :
实现Interceptor接口 实现必须的三个方法
init() :拦截器初始化 服务器启动时候就初始化所有需要的拦截器
intercept(ActionInvocation invocation):拦截 action访问的时候执行
destroy():销毁服务器停止的时候销毁
申明和使用拦截器:
<package name="inter" extends="struts-default" namespace="/inter">
<!-- 申明拦截器:拦截器在此申明后,在web服务器启动的时候就会被初始化 -->
<interceptors>
<interceptor name="inter1" class="com.example.MyInterceptor1"></interceptor>
</interceptors>
<action name="user_*" class="com.example.UserAction" method="{1}">
<!-- 申明该action使用该拦截器:使用后,访问该action的请求,会先经过拦截器 -->
<interceptor-ref name="inter1"></interceptor-ref>
<result>/index.jsp</result>
</action>
</package>
拦截器作用范围:
1.局部使用:在action内部使用,只作用于该action <action name="user_*" class="com.example.UserAction" method="{1}">
<!-- 使用拦截器 -->
<interceptor-ref name="inter1"></interceptor-ref>
<result>/index.jsp</result> </action>
拦截器栈interceptor-stack:包含多个已经申明的拦截器。拦截器和拦截器栈都在interceptors标签内申明
定义拦截器栈的时候,引用拦截器的顺序决定了创建拦截器对象的顺序。(先指定就先创建)
<interceptors>
<interceptor name="inter1" class="com.example.MyInterceptor1"></interceptor>
<interceptor name="inter2" class="com.exampler.MyInterceptor2"></interceptor>
<!-- 定义栏截器栈 -->
<interceptor-stack name="interStack">
<interceptor-ref name="inter1"></interceptor-ref>
<interceptor-ref name="inter2"></interceptor-ref>
</interceptor-stack>
</interceptors>
6.Struts2的标签库
引用标签
<%@ taglib prefix="s" uri="/struts-tags" %>
记住一些在jsp页面使用标签___P54
7.OGNL表达式和值栈__P75——P82
使用OGNL表达式的时候也需要引入标签库
<%@ taglib prefix="s" uri="/struts-tags" %>
OGNL是通过 对象名.方法名() 的形式来调用对象的方法
OGNL是基于上下文和Struts的构建ActionContext 使用OGNL映射。ActionContext中映射包括以下:
application - 应用范围的变量
session - 会话范围的变量
root / value stack - 所有操作变量都保存在这里
request - 请求范围的变量
parameters - 请求参数
atributes - 存储的属性页面,请求,会话和应用范围
重要的是要明白,操作对象是始终可用值栈中的。
在jsp页面获取值的方式,value中什么时候用# ,% ,{}要注意
<s:property value="#name"/>
例如,我们在对象栈中添加一个Person对象
Person p=new Person();
p.serName("aaa");
p.serId("1");
ActionContext.getContext.getValueStack().push(p); //把p对象放到对象栈栈顶
在JSP页面要输出p对象里的name属性:
取值
<s:property value="name" />
可以看出如果把一个对象放到对象栈中,我们不用访问其方法,只需直接访问该属性,就像上面要输出p对象里的name属性,value 指定的是 name 而不是 p.name
因为把一个对象放到对象栈中,该对象的属性就直接存放在对象栈中了。
如果对象栈中还有另一个名为name的对象,则从栈顶开始向下访问,直到第一次访问到name对象为止。在开发中要尽量避免同名属性。
值栈
https://www.jianshu.com/p/237dcb11770e
值栈中数据的存取
值栈实际上是一个接口
获取ValueStack的三种方式
1.通过ActionContext对象获取值栈
ValueStack stack1= ActionContext.getContext().getValueStack()
2.ServletActionContext继承了ActionContext,它与web容器耦合,可以获取web容器的一些信息.
ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());
3.极少用
ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
8.文件上传
博客中有
9.Hibernate框架是当今主流的Java的持久层框架之一
需要两个配置文件,一个是hibernate.cfg.xml的配置文件,一个mapping的映射文件 例如:Person.hbm.xml
ORM的概念
ORM(Object Relational Mapping) 就是利用描述对象和数据库表之间映射的元数据,自动把Java应用程序中的对象,持久化到关系型数据库的表中
Query
executeUpdate()方法,支持HQL语句的更新和删除操作