一,框架的扩展名问题:
,struts2框架的默认扩展名:.action和空字符串。在框架的属性文件default.properties中进行默认配置:struts.action.extension=action,, ,如何覆盖框架的默认扩展名:
a,在struts.xml文件中增加常量标签(推荐使用)
<!--声明常量 -->
<!--覆盖框架默认扩展名 -->
<constantname="struts.action.extension"value="action,,do"></constant> b,在自定义属性文件中struts.properties中设置(只要在默认的default.properties中设置,都可以通过这种方式覆盖)
struts.action.extension=action,,do c,在web.xml文件中进行设置:
<!--配置框架的核心调度器,设置了初始化参数 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>action,,do</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> 注意:如果以上三种情况同时存在,那么过滤器设置起作用。如果过滤器参数设置不存在,那么属性文件(struts.properties)设置起作用。这和我们源码初始化这些文件的先后顺序有关。而我们推荐是在struts.xml文件中进行设计的。所以下边类似的,我只是演示在struts.xml文件中的设计方式。 二,框架的字符编码问题: 1,框架默认的字符编码是:UTF-8,也是在default.properties中设置的:struts.i18n.encoding=UTF-8 2,覆盖框架的默认字符编码:
在struts.xml文件中进行常量配置,当然在struts.properties文件中和过滤器设置初始化参数也可以,这里不再演示。
<!-- 覆盖框架的默认字符编码 -->
<constantname="struts.i18n.encoding"value="GB18030"></constant> 三,框架的开发模式:
在开发中xml文件我们会经常修改,但是我们又不想每次修改就进行服务器的重启部署等,所以我们可以在开发过程中将框架的默认设置为开发模式,有利于我们开发的效率的提高。当然注意在我们完成以后上线的时候还需要改回默认的。防止不必要的麻烦发生。 1,对于struts.xml文件的修改不需要进行服务器重启,可以在其内进行这样设置,覆盖默认的:
<!--设置框架重新加载配置文件的标识 -->
<constantname="struts.configuration.xml.reload"value="true"></constant> 2,当然我们想的还有属性文件等,这需要我们设置为开发模式(更常用):
增加常量标签,进行开发模式设置,这里设置以后就会将上边的设置进行覆盖,所以设置这一个就够了:
<!--设置开发模式 -->
<constantname="struts.devMode" value="true"></constant> 四,框架命名空间的问题: 1,简述:命名空间namespace其实是<package>标签的一个属性,用来对action请求的路径进行管理。所谓的包<package>表示对Action配置的管理。包名是应该具有唯一性的标识,不能存在相同的两个包名。命名空间正常来讲不应该存在相同的名称,如果两个命名空间名称相同,而且存在相同的action名称,那么后面配置的action会起作用。 2,访问action对象时,请求路径的格式为:命名空间 + "/" + Action的name属性值。
但是用户也可以在发送时,添加额外的路径:例如:命名空间 + "/"额外路径 + "/"+ Action的name属性值,这样框架任然可以访问到的,这和框架的解析路径方法有关,算是个缺陷吧,但是框架也进行相关补充,可以弥补。 3,如何限制用户的非法路径:
<!--限制请求的命名空间必须符合规则 -->
<constantname="struts.mapper.alwaysSelectFullNamespace"value="true"></constant> 五,框架的action问题: 1,根据解析请求路径,获取action的名称,到配置文件中查找到action的完整类名,反射创建。
Action类设置要求:必须提供public的无参数的构造方法。Action对象是每次请求都创建一个新的实例,所以action是多例的,它解决的线程安全问题。(但是性能不高)这些都是基于框架的源码的设置。 六,框架中方法的编写:
1,默认方法: 框架调用Action的方法,默认方法名称为execute
默认方法execute的命名规则:
必须是public
必须返回类型是String
必须名称叫做execute
必须是无参数的 2,如果希望不使用默认的execute方法名称,那么也可以自定义方法名称,但是自定义方法名称的声明规则必需与execute方法声明规则一致。请求自定义方法的方法: a,通过感叹号的方式指定被调用的方法名称。这种调用方法的方式叫做动态方法调用,例如:uri = /user/login!login.action. 对于动态方法调用可以动态的调用到Action中的任意方法,但是并不是一定有效,而且开发方式属于紧耦合开发。所以这种方式不推荐使用。 b,如何禁止动态方法调用,禁止以后如何指定呢?
<!--禁止感叹号的动态方法调用 -->
<constantname="struts.enable.DynamicMethodInvocation"value="false"></constant> <!--设置method方法即可-->
<action name="login"class="com.bjpowernode.struts2.action.LoginAction"method="login">
<resultname="success">/success.jsp</result>
<resultname="login">/login.jsp</result>
</action> c,如果一个类有好多方法,我们如何才能简化配置呢?通过通配符的方式进行简化配置:{1}表示匹配第一个*,只要我们传过来的是方法的名字即可。但是通配符的使用要慎重,不要弄出漏洞,防止不法分子的巧弄URI进行破解。
<action name="*" class="com.bjpowernode.struts2.action.LoginAction"method="{1}">
<resultname="success">/success.jsp</result>
<resultname="login">/login.jsp</result>
</action> 当然了,还有很多在struts.xml配置的属性,这里我仅仅是列出了一些常用的,经常需要我们配置的。我们只要抓住这个原理,知道原来框架在那配置的,指定的key是什么,如何解析的,就非常简单了。当然了很多一部分是在default.properties属性文件中进行的配置,我们需要重点掌握。 其实框架都是人设计的,我们只要按照正常人的思维去思考问题,基本上和框架实现的是差不多的。例如,你设计框架肯定会有默认的编码设置,当然你不会写死,会给开发人员覆盖的机会。当然很多配置,我们都在固定的文件中,利用固定的方法进行修改,这是非常符合常规的。所以了解了框架的原理,还是非常简单的。总结中……

Struts 2(二)的更多相关文章

  1. Struts笔记二:栈值的内存区域及标签和拦截器

    值栈和ognl表达式 1.只要是一个MVC框架,必须解决数据的存和取的问题 2.struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 1.  ValueStack是一个接口,在struts ...

  2. struts(二)——struts框架实现的基本原理

    上一篇文章,我们介绍了MVC框架的基本原理,并指出了这个基本框架中存在大量if…else的问题.今天我们来介绍一下struts框架,让struts解决这个问题. 首先,看一下粗略的时序图: Actio ...

  3. Struts(十二):异常处理:exception-mapping元素

    配置当前action的声明异常处理 1.exception-mapping元素中有2个属性 exception:指定需要捕获的异常类型 result:指定一个响应结果,该结果将在捕获到异常时被执行.即 ...

  4. 如何下载struts 2及其各个包的作用

    一.http://archive.apache.org/dist/struts/library/ 二. struts官网: http://struts.apache.org/ 进入主页后点击" ...

  5. Struts框架笔记04_拦截器_标签库

    目录 1. Struts2的拦截器 1.1 拦截器概述 1.2 拦截器的实现原理 1.3 Struts的执行流程 1.4 拦截器入门 1.4.1 环境搭建 1.4.2 编写拦截器 1.4.3 配置拦截 ...

  6. Struts+Hibernate+Spring面试题合集及答案

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 2 ...

  7. Struts+Hibernate+Spring面试题合集及答案(转)

    Struts+Hibernate+Spring面试题合集及答案 Struts+Hibernate+Spring 面试题合集 1 1. Hibernate部分 2 1.1. Hibernate工作原理 ...

  8. SSH框架简化(struts2+spring+hibernate)

    目的: 通过对ssh框架有了基础性的学习,本文主要是使用注解的方式来简化ssh框架的代码编写. 注意事项: 1.运行环境:Windows 8-64位,Eclipse(开发工具),jdk1.8.0_91 ...

  9. java SSH框架详解(面试和学习都是最好的收藏资料)

    Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ...

随机推荐

  1. python安装mysqlclient模块报fatal error: Python.h:解决方法

    在搭建Flask框架安装mysqlclient模块时候老是报fatal error: Python.h:错误,折腾老半天,百度了老半天看了不少大神帖子,就是没解决, 后来发现这不是个BUG,都是自己的 ...

  2. hdu5745--La Vie en rose (DP+bitset)

    好题,学到新姿势! 题意:给两个字符串 a 和 b ,b可以进行变换,规则是可以任意交换相邻两个字符的位置,但是不可以有交叉(例如3和4交换,5和6交换 互不影响,但是2和3,3和4就不可以).求a中 ...

  3. socket http tcp udp ip 协议

    Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接. socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作 ...

  4. Jenkins配置自动打包 -- 遇到的坑

    1.把gradle路径设为本地路径 Jenkins部署在远程linux服务器上,使用git将代码下载到服务器路径下后,无法使用gradle命令 因为默认配置都是gradle同步时 实时从网上下载,进入 ...

  5. C#:使用ListView动态添加数据一直闪烁的解决办法

    首先,自定义一个类ListViewNF,继承自 System.Windows.Forms.ListView using System; using System.Collections.Generic ...

  6. Linux环境下Java中文乱码解决方案

    相信很多朋友遇到过Java的乱码问题,最近我也在解决一个“使用文本生成图片过程中中文以及特殊字符乱码”的问题:花了我大量时间,Debug了sun.font.sun.awt下面的各种源码,终于搞懂了其机 ...

  7. StreamSets学习系列之StreamSets支持多种安装方式【Core Tarball、Cloudera Parcel 、Full Tarball 、Full RPM 、Docker Image和Source Code 】(图文详解)

    不多说,直接上干货! Streamsets的官网 https://streamsets.com/ 得到 https://streamsets.com/opensource/ StreamSets支持多 ...

  8. ES6基础教程一 学习笔记

    一.变量的声明 1.var 声明全局变量 在ES6中var用来声明全局变量. 2.let 声明局部变量 3.const 声明常量 二.变量的解构赋值 //1.数组赋值 let [a,b,c]=[1,2 ...

  9. docker(二)部署docker容器虚拟化平台

    yum安装方法参考:https://www.cnblogs.com/yufeng218/p/8370670.html https://www.cnblogs.com/straycats/p/84112 ...

  10. 利用nginx解决跨域问题

    访问我的博客 前言 最近遇到了跨域问题,结合之前[微信支付开发本地接收异步通知回调]的经验,利用 Nginx 实现了跨域. 公司之前为了解决跨域问题,用的是 iFrame,反正对于只做后端的我而言,觉 ...