package:跟项目中的package没关系,这里的关系是用来管理action
name:给这个package起个名字,没有什么特殊的意义,一般情况下它的命名是按照package管理action的分类来命名,还有就是package和package的名字不能重复
namespace:访问路径地址前缀,与name没有关系,跟其他的package中的namespace能不能重复,没有要求
extends:继承的意思,继承自struts-default,必须写,不然会出错了,名字也不能更改。它是从struts-2.2-core下面的struts-default.xml,这里配置了很多默认的属性
abstract:抽象的意思,生命的一个标志,当前这个文件不能独立运行,只能等待被继承。
<action name="helloAction" class="cn.hd.hello.HelloAction" method="hello">
action配置详解
name:给action起个名字,决定了访问路径最后的地址
class:类的完整路径(默认为ActionSupport类)
method:访问类中的方法(默认为execute)
<result name="success">/hello.html</result>
result:配置详解
name:对应的是action类中的method的返回值,名字和结果只要与action类中的返回结果一样就可以
type:结果的类型(默认的是转发,也可以设置为其他的值)
dispatcher:转发;redirect:跳转的页面
<include file="cn/hd/dynamic/struts01.xml"></include>
include:在src struts.xml可以去读其他位置的xml配置文件。要求 新创建的xml必须有约束
默认的常量配置,文件名为default.properties
如何修改常量
(1)在struts.xml中修改
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!--i18n 国际化,相当于在servlet中设置的编码,解决了post请求的中文乱码-->
(2)在src目录创建struts.properties文件,直接在该文件中修改常量即可
(3)在web.xml文件中修改,添加一个context-param,在param-name中书写常量名,在param-value中书写常量值。
<context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
从上面我们可以看到有三种方法来修改常量,要是同时修改一个常量,哪个有效呢?
web.xml>struts.properties>struts.xml
至于想用哪种方法修改,全凭自己意愿,个人建议使用struts.xml
(1)i18n.encoding 设置编码,解决了post请求的乱码问题
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
(2)struts.action.extension 设置action的访问扩展名
extension使用设置action访问的扩展名,action,, 可以改成do
为什么改成do以为struts1用的是do,如果改成do那么在访问路径中的action中必须加上do,否则会报404错误
<constant name="struts.action.extension" value="do"></constant>
(3)struts.devMode 设置开发者模式认为关闭
develpoerMode开发者模式
1.热部署,修改配置文件后,等一会时间,会自动加载
2.提高错误信息的提示(友好的错误提示)
<constant name="struts.devMode" value="true"></constant>
(1)动态方法
为什么需要动态方法?
简化代码节省时间,提高开发效率,推荐使用
<action name="userAction_*" class="cn.hd.dynamic.UserAction" method="{1}">
<result name="success">/hello.html</result>
</action>
action配置中的name属性,决定着浏览器的访问地址,Struts2可以采用通配符的方式去读取method{1}会自动将路径中的userAction...配置到method中
(2)开启动态方法
首先要开启动态方法的常量
动态方法调用常量,默认是关闭的
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
将action中的method属性删除没这样就完成了动态方法的开启
(3)测试时候,在浏览器的路径中,输入action值+!+方法名(Action中的方法名)
注意事项:第一种方法在struts2的高版本中会无效,首先你也要开启动态方法,解决方法:增加allowed-methods属性
<action name="userAction_*" class="cn.hd.dynamic.UserAction" method="{1}" >
<result name="success">/hello.html</result>
<allowed-methods>update,delete,add,select</allowed-methods>
</action>
(4)默认配置
method 属性可以不写,默认方法为execute
result 标签中的name属性可以不写,默认属性可以不写为success
type 可以不写默认为dispather
class可以省略不写,默认为ActionSupport,打开这个文件,它里面有execute方法,该方法返回一个success字符串
<action name="defaultAction" class="cn.hd.default_demo.DefaultAction" method="execute">
<result name="success">/hello.html</result>
</action>
默认的action地址,如果请求地址不存在,那么默认访问default-action-ref里面的action
<default-action-ref name="defaultAction"></default-action-ref>
以下是以上文件截图