笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
Struts2登录
1. 需要注意:Struts2需要运行在JRE1.5及以上版本
2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping> |
3. 引入Struts2的依赖包,将依赖包拷贝到WEB-INF/lib下
* commons-logging-1.0.4.jar
* freemarker-2.3.15.jar
* ognl-2.7.3.jar
* struts2-core-2.1.8.1.jar
* xwork-core-2.1.6.jar
* commons-fileupload-1.2.1.jar
4. 提供struts2配置文件struts.xml,放到src下
5. 创建Struts2的Action,Struts2的action可以不用继承Struts2框架中的任何类,也不用实现Struts2框架中的任何接口,所以Struts2的Action可以是一个POJO(纯粹的Java对象),所以Struts2的
Action测试更容易。一般情况下会继承ActionSupport。
继承的好处:
1). 重写方法,可以防止方法名写错,重写方法时加上override。
2). 利用父类或接口中定义好的字符串常量。
3). 开发更规范
Struts2缺省方法名称:public String execute() throws Exception;默认情况下执行。
6. 在Action中提供getter和setter方法,便于收集数据(这样收集数据的模式一般可以称为属性驱动模式)。若页面有与它对应的属性时,可以直接获取值(通过拦截器利用反射取值)。
7. struts2中配置文件对应的action中方法若有返回值必须是String类型且无参数。
8. 将JSP和Action配置到struts.xml配置文件中。
1). action需要配置在package中
2). 返回需要配置在result
3). package必须继承struts-default(18个拦截器),这样就拥有了最基本的功能。
标准配置:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<struts> <package name="struts2" extends="struts-default" namespace="/"> <action name="testShow" class="com.bjpowernode.action.TestAction"> <result name="bj">/index.jsp</result> </action> </package></struts> |
在配置文件中result中name="success"和type="dispatcher"为默认值,可以不写。
9. 了解struts-default.xml配置文件,default.properties,Struts2的默认后缀为.action
10. StrutsPrepareAndExecuteFilter实现Filter接口。记住这个过滤器。
struts2的常用配置参数
1. struts2的常用配置参数
|
1
2
3
4
5
6
7
8
9
10
11
|
<!-- 配置编码方式 --><constant name="struts.i18n.encoding" value="utf-8"></constant> <!-- 会提供更加友好的提示信息 --><constant name="struts.devMode" value="true"></constant> <!-- 当struts.xml配置文件发生修改,会立刻加载,在生产环境下最好不要配置 --><constant name="struts.configuration.xml.reload" value="true"></constant> |
以上参数配置方式有两种:
* 在struts.properties文件中配置
* 在struts.xml配置文件中(借助帮助提示查看位置,配置文件报错可能是位置顺序错误)
2. 可以为某个模块建立单独的配置文件,该配置文件的格式需要和struts.xml配置文件的格式一致在struts.xml配置文件中采用<include>标签引入。引入格式为:
</package>下面加上:
<include file="com/bjpowernode/action/one.xml"></include>
Struts2的Action访问Servlet API 和设置Action中对象的值
1. Struts2的Action访问Servlet API
1). 可以通过ActionContext访问Servlet API,此种方式没有侵入性。(静态方法)
ActionContext.getContext().getSession().put("username",user.getUsername());
实际上是将数据存到了MAP中。通过map的集合设置session和取得session里面的值(get)。
ActionContext对象的getSession方法返回的是一个map集合。该map集合是session底层实现,键值对。存到session中的值,可以通过map.get()方法取出来。ActionContext.getContext()
先得到一个actionContext对象。
2). 使用ServletActionContext(是ActionContext的子类)访问serlvet API
ServletActionContext.getRequest().getSession().setAttribute("username", user.getUsername());
* getPageContext();
* getRequest();
* getResponse();
* getServletContext();
3). 可以实现Aware(这个文档里没查到)接口访问ServletApi,具有一定的侵入性
a. 要实现某个AWare接口 (ServletRequestAware,ServletResponseAware...)
b. 要声明一个对应的serlvet对象:private HttpServletRequest request;
c. 要实现AWare接口的方法:
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
* ServletRequestAware取得HttpServletRequest对象
* ServletResponseAware取得HttpServletResponse对象
* ServletContextAware取得ServletContext对象(工具类)
2. 在Struts2中默认为转发,也就是<result>标签中的type="dispatcher",type的属性可以修改为重定向
Struts的重定向有两种:
type="redirect",可以重定向到任何一个web资源,如:jsp,html或Action,如果要重定向到Action,需要写上后缀:xxxx.action
type="redirectAction",可以重定向到Action,不需要写后缀,此种方式更通用些,不会因为后缀的改变影响配置
3. 关于Struts2的type类型,也就是Result类型,他们都实现了共同的接口Result,都实现了execute方法。他们体现了策略模式,具体Result类型参见:struts-default.xml文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<result-types> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> </result-types> |
我们完全可以自己根据需求扩展Result类型
4. 全局Result(紧接着写在<package>下面)和局部Result(写在action中)。可以通过配置文件继承,让多个包继承这个全局结果。
<!-- 全局result -->
<global-results>
<result name="login" type="redirect">/login.jsp</result>
</global-results>
5. 设置Action中对象的值(该对象的类中的属性有set和get方法)。
1). 直接对Action中的对象赋值,在action中定义对象: (推荐)
eg:private User user;(action中有user的set和get方法)
在html中可以采用如下方式命名输入域:
<form action="login.action">
用户:<input type="text" name="user.username"><br>
密码:<input type="password" name="user.password"><br>
<input type="submit" value="登录">
</form>
或:
<s:textfield name="user.username" label="姓名"></s:textfield>
2). Struts2可以采用类似于Struts1中的ActionForm方式收集数据,这样方式叫ModelDriven模式 (不推荐此种方式)
如何实现模型驱动模式?
* 创建User
* Action需要实现ModelDriven接口
* 实体对象不使用setter getter方法,但是要实例化对象(new)
* 实现getModel()方法,返回Bean对象(如:返回user).
* 页面只填写属性名称即可
命名空间和乱码处理
1. 采用命名空间,可以区分不同的包下相同的Action名称。如果package的namespace属性没有指定,使用的默认命名空间为""
Struts2中Action的完整路径应该为:namespace+ "/" + Action的名称
包中加空间:<package name="struts-one" extends="struts2" namespace="/a">
首先在指定的命名空间下查找Action,如果找到了就使用此Action,如果没有找到在上层目录中查找,一直到根(缺省命名空间),在此过程中如果找到了Action就会使用此Action,如果都没有找到就会
抛出Action没有找到异常
命名空间中,可以建立相应的文件夹,将相应的jsp文件放入其中。可以在提交页面直接写要访问的jsp,但jsp页面中要去掉basepath。
2. 关于Struts2的字符集问题,主要有三种配置方式(这些方法貌似只对POST请求有作用?):
* struts.properties配置文件中
struts.i18n.encoding
* struts.xml配置文件
<constant name="struts.i18n.encoding" value="UTF-8"/>
* 在StrutsPrepareAndExecuteFilter中配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>struts.i18n.encoding</param-name> <param-value>UTF-8</param-value> </init-param></filter> |
3. 数据库为mysql时需要处理中文范例:
1). 修改tomcat--->server.xml的编码方式
2). struts.xml配置常量
3). 在数据库连接串中加编码格式:
jdbc:mysql://localhost:3306/dljd?useUnicode=true&characterEncoding=UTF8(好像是mysql特有)
注意:转义字符
Struts2的Action中包含多个方法如何调用
1. 具体的调用方式:
* 方法的动态调
* 在<action>中配置method属性
* 使用通配符
1). 方法的动态调用方式:(不推荐,会将方法名暴漏出来。但可以通过伪连接隐藏起来。)
action名称+!+方法名称+后缀
<a href="user!add.action">添加用户</a><br>
<a href="user!del.action">删除用户</a><br>
!!动态调用参数配置,默认为true,可以调用,设置为false不能通过此种方式调用。
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
!!Action中的所有方法格式必须和execute方法一致(参数,返回值,异常最好也一样)
2). 在<action>中配置method属性
<action name="add" class="com.bjpowernode.struts2.UserAction" method="add">
<action name="update" class="com.bjpowernode.struts2.UserAction" method="update">
3). Struts2的Action中包含多个方法如何调用(使用通配符)
具体配置("{1}"表示第一个*所代表的值。)
<action name="*User" class="com.bjpowernode.struts2.UserAction" method="{1}">
<result>/{1}Success.jsp</result>
</action>
注意:页面上也要与action中保持一致,如:
<a href="loginUser.action" target="_blank">login</a>
<a href="saveUser.action" target="_blank">login</a>
showUser.jsp
saveUser.jsp
在Struts2的<action>标签class、name、method和result标签上都可以使用通配符。通配符的作用就是为了减少配置量,通配符需要建立在约定的基础上。
2. 多个通配符*-*(*代表变化的)
1). 配置xml文件:
<package name="one" extends="struts2" namespace="/">
<action name="*-*User" class="com.bjpowernode.action.TestAction" method="{1}">
<result name="{2}">/{1}User.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
单个通配符和多个通配符若后面跟的内容一样时(*User和*-*User),不能同时使用。因为可能第一个会将第二个的请求拦截住。
2). 页面调用:<a href="save-saveUser.action" target="_blank">save</a>
3). action类中的返回值:
public String save(){
str = "保存方法";
return "save";
}
笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用的更多相关文章
- struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...
- Struts 2读书笔记-----Action访问Servlet API
Action访问Servlet API Struts2中的Action并没有和任何Servlet API耦合,这样框架更具灵活性,更易测试. 对于Web应用的控制器而言,不访问ServletAPI是几 ...
- Action访问Servlet API的三种方法
一.为什么要访问Servlet API ? Struts2的Action并未与Servlet API进行耦合,这是Struts2 的一个改良,从而方便了单独对Action进行测试.但是对于Web控制器 ...
- struts2的action访问servlet API的三种方法
学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...
- Struts2笔记--Action访问Servlet API
Web应用中通常需要访问的Servlet API就是HttpServletRequest.HttpSession和ServletContext,这三个接口分别代表JSP内置对象中的request.se ...
- Struts2学习笔记(五)——Action访问Servlet API
在Strut2中访问Servlet API有三种方式: 1.通过ActionContext访问Servlet API,推荐使用这种,但是这种方案它获取的不是真正的事Servlet API. 步骤: 1 ...
- Action访问Servlet API
访问Servlet API 1.通过ActionContent类访问Servlet API ActionContext中访问Servlet API的几个常用的方法: (1)Map getApplica ...
- 关于Struts2自动装配和访问Servlet API
自动装配 1.根据属性的getter和setter获取值 index.jsp <s:form action="hello" method="POST"& ...
- 配置Struts2及Struts2访问servlet api的方式
Struts2的起源与背景 在很长的一段时间内,在所有的MVC框架中,Struts1处于绝对的统治地位,无论是从市场的普及范围,还是具体的使用者数量. 其他MVC框架都无 法与其相比,作为一一款优秀的 ...
随机推荐
- X.509证书的编码及解析:程序解析以及winhex模板解析
一.证书的整体结构:证书内容.签名算法.签名结果. 用ASN.1语法描述如下: Certificate::=SEQUENCE{ tbsCertificate TBSCertificate, signa ...
- unity里面的gameobject和transform的关系
一切都是物体(gameobject),而transform是物体的一个基本属性类,包含位置,旋转,缩放,三个基本属性,两者之间可以互相转换 查找物体,建议用transform,GameObject无法 ...
- 测试用例文件的存放和创建,对page objeck的理解
如:(注意我下面这种要用eval函数取拼接的)
- PHP中的=>,->,@,&,::,%
在php中数组默认键名是整数,也可以自己定义任意字符键名(最好是有实际意义).如: $css=array('style'=>'0',‘color’=>‘green‘), 则$css['st ...
- sql server 全文检索 使用
目前项目中的日志查询 功能 由于长年累月的写入,目前已经达到千万级,对日志进行like 查询,速度可想而知. 此处只讨论 在数据库的优化. 当时 想到两个方案,一个是分区,一个 是全文检索. 分区的话 ...
- three3D地图
终于闲下来了,前段时间做了个项目,高精度精准定位系统,用到了three3D地图 听起来是不是很炫酷?其实并不难.先把部分代码附上(文件比较多,只粘贴部分的) $(function () { i ...
- D3D-GetBackBuffer &GetFrontBufferData 抓屏&D3D抓取GPU数据
HRESULT GetBackBuffer( [in] UINT iSwapChain, [in] UINT ...
- sql的预编译问题
- objects & values & types
[objects & values & types] 1.Every object has an identity, a type and a value. An object’s i ...
- oracle返回最大值一条记录
虽然网上例子很多,但是试过多种办法都无效,原代码出处: https://blog.csdn.net/qyshibb/article/details/73332075 这个例子简单有效 select p ...