Struts2学习笔记 - Part.01
1.关于Struts2中的struts.xml文件中action设置
<!-- 它是一个通用action,此处的*表明它可以处理任意的请求-->
<action name="*" > <!-- 此处的{1}代表前面第一个星号所匹配的字串 -->
<result name="success">/WEB-INF/content/{1}.jsp</result> <!--跳转到*(所代表的任意字符)号页面-->
</action> <!-- 它是一个匹配*Action*的action-->
<action name="*Action*" > <!-- 此处的{1}代表前面第一个星号所匹配的字串 -->
<result name="success">/WEB-INF/content/{1}_{2}.jsp</result> <!--跳转匹配*Action*的页面-->
<!--例如,输入/test/abcActionxyz跳转页面为/test//WEB-INF/content/abc_xyz.jsp -->
</action> <!-- 该action负责处理loginPro的请求,
指定method,则由method的方法处理,
没有指定method,由LoginProAction的execute()方法处理 -->
<action name="loginPro"
class="org...XX.action.LoginproAction"
method="xyz"></action>
2.安装Struts2的
(1)拷JAR包。app\struts2-blank.war\WEB-INF\lib下的所有JAR包;
(2)修改web.xml文件an。加载Struts 2的核心Filter;
(3)在classes目录下增加一个Struts 2的配置文件:struts.xml(struts2-blank.war下的struts.xml拷入即可);
3.Struts2的开发步骤:
(1)先定义一个能发送请求的页面:
可以是超链接,也可以是表单;(个别情况下用户可以直接以GET方法发送请求)
(2)开发Action类(Action的三个要求):
Struts2 对Action并没有过多的要求,只要求:
A. 推荐实现Action接口,或继承ActionSupport类;
ActionSupport实现了Action接口,它增加了一些类型转换支持、输入校验支持等功能。
而且它实现execute()方法,该方法直接返回SUCCESS;
B. 为每个请求参数都提供Field,并为之提供相应的setter和getter方法;
为需要传到页面的处理结果也定义Field,并提供对应的setter和getter方法。
Struts2不会区分Action里的哪个Field用于封装请求参数,哪个Field用于封装处理结果。
对系统而言,封装请求参数的Field和封装处理结果的Field完全平等;
C. 该Action类应该有无参数的构造器(默认为execute);
D. 返回值必须是String;
E. (重复强调)Action的处理方法不能有形参声明;
(3) 配置Action
所有的Action都要放在Package里配置;
<action.../>元素通常有如下常用属性:
-name:指定该Action处理哪个请求;
-class:制定该Action对应的处理类;
-method:指定使用Action的哪个方法来处理用户请求,默认值为execute();
并为处理返回的字符串,指定相应的物理视图<result name="">"/*.jsp"</result>
/************************************
Action接口与ActionSupport
Action接口中定义了5个字符串常量(ERROR"error",INPUT"input",LOGIN"login",NONE"none",SUCCESS"success"),
和一个execute()抽象方法;
************************************/
4.Struts2详细运行机制:
(1)浏览器发送请求:abc.action(-action后缀可以保留,也可以省略);
(2)浏览器发送的请求,首先被StrutsPrepareAndExecuteFilter拦截
--因为我们在web.xml中指定StrutsPrepareAndExecuteFilter来过滤所有的用户请求;
(3)StrutsPrepareAndExecuteFilter会去创建Action实例;
例如(简介):我们请求abc.action,StrutsPrepareAndExecuteFilter会搜索struts.xml文件中name为abc的Action配置,
根据class属性,“使用反射”来创建Action实例;
例如(详解):
//假如该Filter收到abc.action的请求,通过解析struts.xml获取类名
String clazzProp="MyAction";
//反射:通过类名为参数反射,获取Action类对应的Class对象
Class actionClazz=Class.forName(clazzProp);
//用反射创建了Action的实例(要求Action类有无参数构造器)
Object actionInst=actionClazz.newInstance();
(4)调用
Map<String,String> paramMap=request.getParameterMap() //返回所有的请求参数;
使用循环(String paramName:em)
{
//得到请求参数名对应的setter方法
Action类.getMethod("set"+paraName的首字母大写);
Method setter=actionClazz.getMethod("set"+paramName.substring(0,1).toUpperCase()
+paramName.substring(1),String.class);
//得到请求参数对应的值
String paramValue=paramMap.get(paramName);
//以Action实例为调用者,调用setter方法,把请求参数值作为参数值传入
setter.invoke(actionInst,paramVaue); /*invoke的使用举例与解释:
*String result = (String)method.invoke(obj ,sql);
*执行obj的method方法(参数为sql),返回String类型结果 */
}
(5)再次通过反射来调用method属性所指定的方法;
返回一个字符串;
(6)根据strut.xml文件中的<result.../>元素的name以及物理视图资源,
跳转到实际的视图资源;
===============如何在action中访问Servlet API===============
总有些时候,需要访问Servlet API
比如需要把数据存入session、Application,或添加cookie:response.addCookie()
Struts2提供了两种方式访问Servlet API:
伪访问:借助于ActionContext
ActionContext提供了getSession -模拟访问Http Session
getApplication -模拟访问Appication
真访问:(比如要添加Cookie):借助于ServletActonContext(需要导入HttpServletResponse包)
ServletActonContext提供了如下静态方法:
- static PageContext getPageContext()
- static HttpServletRequest getRequest()
- static HttpServletResponse getResponse()
- static ServletContext getServletContext()
=================Struts2常量配置=================
Struts2常量,也叫Struts2属性,作用:控制整个Struts2的应用特性;
一个常量名 指定一个常量值,配置方式有3种:
- 在web.xml中:每个常量要4行:
<!-- 通过Filter配置初始化参数,就可配置Struts2的常量 -->
<init-param>
<param-name>常量名</param-name>
<param-value>常量值</param-value>
</init-param>
- 在struts.xml文件配置(推荐):
<constant name="常量名" value="常量值"/> --每行配置一个常量
- 额外增加一个struts.properties配置文件
常量名=常量值 --每行配置一个常量
/*****************常用常量********************
<!-- 编码格式 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 上传文件大小限制设置 -->
<constant name="struts.multipart.maxSize" value="-1" />
<!-- 把它设置为开发模式,发布时要设置为false -->
<constant name="struts.devMode" value="true" />
其他:Struts2常用的constant总结
********************************************/
==============Struts2包含其他配置文件及包配置=================
include其他配置文件
企业开发--模块化开发
- 开发阶段:每个人都维护自己的配置文件
- 销售阶段:软件做成模块化:
<struts>
<!-- 包含了其他配置文件 -->
<include file="struts-books.xml"></include>
<!-- 指定了namespace为/users,以为着该包下面所有的Action都处于/user空间下 -->
<package name="books" extends="struts-default" namespace="books">
<action>
<result>***</result>
</action>
</package>
</struts>
/****************************
Struts的配置文件,包括:
Struts-default.xml - Struts2的核心包使用该配置文件;
Struts-plugin.xml - Struts2的插件包使用该配置文件;
Struts.xml - Struts2应用使用该配置文件;
Struts-abc.xml - 这种其他的配置文件,必须被include才会加载
****************************/
配置包:
每个package元素定义了一个包配置。定义package元素时可以指定如下几个属性:
- name:必填属性,指定该包的名字,该名字是该包被其他包引用的key;
- extends:可选属性,该属性指定该包继承其他包,继承其他包可以继承其他包中的Action定义、拦截器定义等;
- namespace:可选属性,定义该包的命名空间;
- abstract:可选属性,指定该包是否是一个抽象包,抽象包中不能包含Action定义;
===================struts2的结果配置===================
逻辑试图名与物理视图的关系,是通过<result.../>元素来管理
标准的result格式:
<result name="" type="">
<param></param> //param输入属性元素,例:<param name="location">物理视图的位置</name>
<param></param>
...
</result>
//可以简化为如下(常用):
<result name="逻辑视图名" type="视图类型">物理视图的位置</result>
支持如下属性
- name:指定逻辑视图名;默认是success;
- type:指定所使用的物理视图模型;
dispatcher(默认值),相对应的是redirect(重定向)
...
(其他在struts-default.xml文件中的struts-default抽象包中result-type)
/*********************************
forward与redirect的区别?
forward:依然是一次请求,地址栏的URL没有变化,请求参数和请求属性都不会丢失;
redirect:重新发送一次新请求(就跟直接在地址栏输入新URL,并回车的效果是一样的)
地址栏的URL会改变,请求参数和请求属性全部都丢失;
*********************************/
常见的结果类型:
chain - Action处理完用户请求后,转发到下一个Action继续处理。
形成链式处理;
dispatcher - 默认值
转发到JSP页面
redirect - 直接"重定向"到新的URL,会生成一次新的请求,原有的请求参数、请求属性都会丢失。
与默认的dispatcher对应;
plainText - 直接显示视图页面的源代码;
stream - 直接生成"二进制"流作为相应;
全局result与局部result:
result元素放在action,就是局部result;
result元素放在global-results,就是全局result;
尽量少用全局result — 只有在多个Action都具有某个通用性质的result时,才考虑使用全局result;
动态结果:
在定义物理视图资源时,可以直接使用OGNL表达式,所以这个物理视图资源可以动态的改变;
动态方法调用(DMI Dyna Method Invocation)
用处不是特别大,大致了解就行
功能:可以在提交请求时,直接提交给Action的指定方法;
就在页面上指定请求地址为:action名字!方法名
- 表明将请求提交给指定Action的指定方法处理
Struts2学习笔记 - Part.01的更多相关文章
- Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)
Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...
- Struts2学习笔记⑧
今天是Struts2学习笔记的最后一篇文章了.用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下. 文件上传与下载.FreeMarker以及昨天没做完的例子 文件上传与下载 文件 ...
- Struts2学习笔记①
Struts2 学习笔记① 所有的程序学习都从Hello World开始,今天先跟着书做一个HW的示例. Struts2是一套MVC框架,使用起来非常方便,接触到现在觉得最麻烦的地方是配置文件.我的一 ...
- Struts2 学习笔记(概述)
Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...
- Fortran学习笔记:01 基本格式与变量声明
Fortran学习笔记目录 01 基本格式与变量声明 格式 固定格式(Fixed Format):Fortran77 程序需要满足一种特定的格式要求,具体形式参考教材 自由格式(Free Format ...
- [struts2学习笔记] 第二节 使用Maven搞定管理和构造Struts 2 Web应用程序的七个步骤
本文地址:http://blog.csdn.net/sushengmiyan/article/details/40303897 官方文档:http://struts.apache.org/releas ...
- 【Ext.Net学习笔记】01:在ASP.NET WebForm中使用Ext.Net
Ext.NET是基于跨浏览器的ExtJS库和.NET Framework的一套支持ASP.NET AJAX的开源Web控件,包含有丰富的Ajax运用,其前身是Coolite. 下载地址:http:// ...
- struts2学习笔记 ⑤
拦截器初探 昨天临睡觉之前看了看拦截器,也在昨天的学习笔记里面胡诌诌了几句,今天就来好好的会会拦截器这个东西.实际上拦截器是一种模块实现的机制<起码我是这么体会的>(至于说书里面说体现了A ...
- Tensorflow学习笔记2019.01.22
tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...
随机推荐
- 11.6 【Linq】分组和延续
11.6.1 使用 group...by 子句进行分组 class Program { static void Main(string[] args) { var query = from defec ...
- HDU 1241 Oil Deposits (DFS or BFS)
链接 : Here! 思路 : 搜索判断连通块个数, 所以 $DFS$ 或则 $BFS$ 都行喽...., 首先记录一下整个地图中所有$Oil$的个数, 然后遍历整个地图, 从油田开始搜索它所能连通多 ...
- 博弈论题目总结(二)——SG组合游戏及变形
SG函数 为了更一般化博弈问题,我们引入SG函数 SG函数有如下性质: 1.如果某个状态SG函数值为0,则它后继的每个状态SG函数值都不为0 2.如果某个状态SG函数值不为0,则它至少存在一个后继的状 ...
- bpm被攻击事件
bpm登录不上,服务器是windows2008,从深信服上面设置了ddos每秒钟连接超5000次封锁,阻断后面的IP连接,,深信服DDOS日志没有记录 在bpm服务器上面通过netstat -a查看发 ...
- 16._source元数据
- Redis启动出错 noauth authentication required.
输入认证过的密码即可. 在命令行中运行: auth password
- ro多层的事务处理失败的困惑
现象: 用 :: ::'' 在客户端用上面的语句取得数据,然后修改数据,通过RO的web service提交数据失败: 用 -- ::-- ::'‘ 在客户端用上面的语句取得数据,然后修改数据,通过R ...
- 【2000*】【Codeforces Round #518 (Div. 1) [Thanks, Mail.Ru!] B】Multihedgehog
[链接] 我是链接,点我呀:) [题意] [题解] 找到度数为1的点. 他们显然是叶子节点. 然后每个叶子节点. 往上进行bfs. 累计他们的父亲节点的儿子的个数. 如果都满足要求那么就继续往上走. ...
- Oracle关联查询-数据类型不一致问题 ORA-01722: 无效数字
一.存在表A和表B,都包含字段user_no,但数据类型不一致,如下: create table A ( user_id varchar2(20), user_no number(12,0), xxx ...
- elasticsearch 权威指南搜索阅读笔记(四)
多索引多type搜索 分页搜索 每页5条 查询一到3页数据 第一页:http://127.0.0.1:9200/blogs2/product/_search?size=5&from=0 第二页 ...