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语句的更新和删除操作