Struts2学习笔记

一、
STRUTS来源自WEBWORK项目
开发步骤:
1、导入8个JAR包
2、配置web.xml文件,添加struts2的过滤器
3、创建JSP视图页面
4、创建action的java类
5、配置struts.xml文件,设置视图关联

搭建步骤:
1、导入需要的8个包,不能全部导
2、配置web.xml文件
    <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、在SRC目录下面创建STUCTS.XML文件,XML内容可以从官方的DEMO中获取

STUCTS.XML文件中的内容:
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "
http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="demo" namespace="" extends="struts-default">
 <action name="hello" method="excute" class="action.HelloAction">
  <result name="ok">/index.jsp</result>
 </action>
</package>
</struts>
说明:
package节点类似JAVA中的包,STRUTS2引用包的概念,name属性就是包名,
可以根据业务或功能分类定义不同的包,避免命名冲突,namespace类似于命名空间,
决定内部所有的ACTION访问URL的父级地址,如(namespace="/demo/page",
以下访问的路径就需要加上“http://localhost:8080/项目名/demo/page/”),
extends属性必须写上,而且值必须是“struts-default”,这样才能够实现struts2的功能。

package节点内的action节点可以有多个,表示同个包中多个动作指向URL;

action节点中的name属性是指定访问时的URL文件名,
如上所示的的完整URL是:
http://localhost:8080/项目名/demo/page/hello,
class属性是指定当前URL所指向的action的完整类名,如果不指定值,则默认是XWORK包中的ActionSupport类,
method属性是指向action类中的执行方法,该方法可以自定义,但返回值必须是字符串,如果不指定值,
默认是:excute方法。

result节点中的name属性值是指定action类中的method所指定的方法返回的字符串值,节点中的文本是指向当接收到name的值时转发的URL路径。
result节点中有type属性,用于指定指向URL路径的方式,主要值有:dispatcher(默认值),redirect,redirectAction,plainText等,
其中当使用redirectAction值时,是直接写重定向到其他action,如果是指向当前包下面的其他ACTION,则中间节点直接写ACTION名称即可,如果是指向其他包中的ACTION,则需要添加PARAM节点,如:
 <param name="actionName">其他ACTION的名称</param>
 <param name="namespace">ACTION所在的命名空间</param>
其中当使用plainText值时,一般是应用于将某个页面的源代码直接输出到页面,如:
 <result type="plainText">
  <param name="location">/index.jsp</param>
  <param name="charset">utf-8</param>
 </result>

二、使用继承实现设置全局视图
package节点中还可以设置全局的视图,如:
 <global-results>
  <result name="err">/err.jsp</result>
 </global-results>
但如果其他包也想实现这样的视图,就需要使用继承的方式实现,如:
<package name="base" namespace="" extends="struts-default">
 <global-results>
  <result name="err">/err.jsp</result>
 </global-results>
</package>
然后其他包分别继承当前的基础包,如:
<package name="demo" namespace="" extends="base">
 <action name="hello" method="excute" class="action.HelloAction">
  <result name="ok">/index.jsp</result>
 </action>
</package>

三、依赖注入属性
struts2提供了依赖注入的属性设置,如:
 <action name="hello" method="excute" class="action.HelloAction">
<!--这里的param就是提供了依赖注入的功能,其中name的值为savePath,则对应的就是ACTION类中添加的set和get属性的方法名称-->
  <param name="savePath">/upload</param>
  <result name="ok">/index.jsp</result>
 </action>

四、指定struts2处理请求的后缀
struts2可以通过设置常量“struts.action.extension”进行修改所请求的路径后缀,如:
<constant name="struts.action.extension" value="do,go"/>
以上的value属性指的意思,如果用户请求的文件后缀分别是.do或.go都将进入struts2来处理,设置多个以英文逗号隔开。

五、struts2的常量
常量可以在struts.xml或struts.properties两个文件中配置,建议使用struts.xml中配置,
在struts.xml中的配置常量如下:
<constant name="常量名称" value="值"/>
在struts.properties中配置常量如下:
常量名称=值
因为常量可以在下面多个配置文件中进行定义,所以需要了解struts2加载常量的搜索顺序:
struts-default.xml
struts-plugin.xml
struts.xml
struts.properties
web.xml
如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值。
以下是常用的常量介绍:
struts.i18n.encoding=utf-8 :指定默认编码集,作用于httpservletrequest的setcharacterencoding方法
struts.serve.static.browserCache=true:设置浏览器是否缓存静态内容,默认值是true,开发阶段设置false
struts.configuration.xml.reload=true:当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段设置为true
struts.devMode=true:开发模式下使用,这样可以打印出更详细的错误信息
struts.ui.theme=simple:默认的视图主题
struts.objectFactory=spring:与spring集成时,指定由spring负责 action对象的创建
struts.enable.DynamicMethodlnvocation=false:该属性设置struts2是否支持动态方法调用,默认值是true
struts.multipart.maxSize=10240000:用于限制上传文件的大小

六、struts2的处理流程
当用户发送请求,进入StrutsPrepareAndExecuteFilter(是struts2框架的核心控制器,它负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户请求到达时,该过滤器会过滤用户的请求。),
 接着进入:Interceptor(Struts2内置的一些拦截器或用户自定义拦截器)
 接着进入:Action(用户编写的action类,与struts1不同,struts2对用户的每一次请求都会创建一个Action,所以线程是安全的。)
 接着进入:Result(获取转发页面)
 接着进入:转发的页面
 最后:解析响应给客户端

七、为应用指定多个struts配置文件
在大部分应用里,随着应用规模的增加,系统中的action的数量也会大量增加,导致struts.xml配置文件非常庞大,可读性及维护性差,所以可以将一个struts.xml文件分解成多个配置文件,然后在struts.xml中包含其他配置文件,如:
<struts>
 <include file="struts-user.xml"/>
 <include file="struts-order.xml"/>
</struts>

八、动态方法的调用和使用通配符定义action
如果action中存在多个方法时,可以使用“!+方法名”调用指定方法,如下:
public class HelloAction{
 public String execute(){}
 public String other(){}
}
如果访问上面的action的URL路径为:/abc/hello,如果要访问other()方法,可以这样调用:
/abc/hello!other,如果不想使用动态方法调用,可以通过设置常量关闭。

也可以使用通配符定义action,如下:
<action name="hello_*" class="action.helloaction" method="{1}">
</action>
如果要访问other()方法,可以通过这样的URL访问:/abc/hello_other

九、接收参数

十、自定义类型转换器
分为:局部转换器和全局转换器
开发步骤:
1、创建自定义的类型转换器的类,该类要继承自defaulttypeconvert类,重写convertvalue方法
2、在Action类所在的包下放置ActionClassName-conversion.properties文件,ActionClassName是Action的类名,后面的-conversion.properties是固定写法,对于本例而言,文件的名称应为HelloWorldAction-conversion.properties 。在properties文件中的内容为:
属性名称=类型转换器的全类名

如果是使用全局类型转换器:
在WEB-INF/classes下或SRC文件夹下放置xwork-conversion.properties文件 。在properties文件中的内容为:
待转换的类型=类型转换器的全类名
xwork-conversion.properties文件中的内容为:
java.util.Date= convert.DateConverter


 struts2中的<s:iterator/>可以迭代多层map,下面我们就以两重map为例,写个的demo:
Map<String , Map<String , String>> map;  
//map初始化  
//jsp页面  
<s:iterator value="map.keySet()" status="s" id="id1">  
  <s:property value="%{#id1}"/>  
  <s:iterator value="map.get(#id1).keySet()" status="ss" id="id2">  
   <s:property value="%{#id2}"/>  
  </s:iterator>  
</s:iterator> 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值