一、搭建Struts2的开发环境
1、把struts解压缩后->struts-blank.jar解压缩->中的web-inf->lib中的jar包全部拷贝到你的应用中
2、在web.xml中增加以下过滤器的配置,拷贝如上的路径……..web-inf->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目录下,建立struts.xml配置文件路径\struts-2.3.14.2\apps\struts2-blank\WEB-INF\classes\struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
</struts>
这样,Struts2环境就可以搭建好。
下面总结struts.xml文件的使用配置
一、核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 核心配置文件
有了该配置文件,但必须有个东西,根据配置文件,指挥着程序走,就是控制器.根据配置文件,指挥控制器进行控制.
所有的请求都要经过过滤器,但是并不是所有的请求都需要过滤器处理!因此请求时会在请求后缀名上加上.action
-->
<framework>
<!--
action:
name:必须有,且唯一。唯一标示action。
class:必须有,要执行哪个JavaBean的类名<!--通过后面的学习发现可以没有,因为默认继承ActionSupport-->
method:可以没有。没有的话就是默认值execute。JavaBean中对应的操作方法。例如一个Customer的JavaBean类中一个添加用户的方法,对应操作方法的特点是:public String addCustomer(){}
"addCustomer"作为Customer类的方法,把自己的信息保存起来
当要执行action name="addCustomer"动作时,对应的Customer类中的method="addCustomer"方法
当执行method="addCustomer"方法时要有结果,最起码"成功"或者"失败"
-->
<action name="addCustomer" class="com.wnl.Customer" method="addCustomer">
<!--
result:代表着一种结果。type决定结果的行为,例如重定向,下载等等。
type:可以没有,默认是dispatcher。转向目标的类型。dispatcher代表着请求转发
name:必须有。对应的是JavaBean中addCustomer的返回值,根据返回值的不同进行转发或者重定向的操作
主体内容:必须有。目标资源的URI
-->
<result type="redirect" name="success">/success.jsp</result>
<result type="dispatcher" name="error">/error.jsp</result>
</action>
<!-- 当执行的操作是"action name="updateCustomer""时,找 Customer类的"updateCustomer"方法
如果返回值为"success"时,就执行请求转发到"success.jsp"页面
-->
<action name="updateCustomer" class="com.wnl.Customer" method="updateCustomer">
<result type="dispatcher" name="success">/success.jsp</result>
</action>
</framework>
二、配置文件中的package
<package>:类似Java编程中的package
name:取一个名字。分模块
namespace:访问动作的路径。一般以"/"开头,在访问该包中的动作时加上此路径。默认值是:""
当前:namespace="/hello/xxx"
访问动作的uri: http://localhost:8080/day24_01struts2_quickStart/hello/xxx/aa/sayHello.action 能访问到
namespace=/hello/xxx/aa中找sayHello.action 没有
namespace=/hello/xxx中找sayHello.action 有
namespace的访问路径的问题总结:
http://localhost:8080/Struts/hello/xxx/aa/sayHello.action
1、先找哪个包的namesapce="/hello/xxx/aa"
a、有这个namesapce:就在此包中找sayHello的动作,没有该动作就从默认包中找,有该动作就执行了
b、没有这个namespace:就继续找谁的namesapce="/hello/xxx"
2、特殊的namesapce
namespace="/":不是默认的
namesapce="":这是默认的,只要找不到的都在此处找
三、Struts2框架提供的默认的配置文件
struts-default.xml:在struts2-core.jar包中-->meta-inf-->struts-default.xml,在其中搜索"struts-default",可以看到定义内容
<package name="default" namespace="/hello" extends="struts-default">
<action name="sayHello" class="com.itheima.actions.HelloAction" method="sayHello">
<!-- 执行sayHello方法,希望显示结果的地方是一个页面,此页面就是一个result,其中的name对应方法的返回值 ,当返回值为
success时转向1.jsp页面,type指明是转发还是重定向,其实结果集result就是一个类,其中"dispatcher必须有定义
就第一在struts-default包中,所以不写此包,启动服务器时就会报错!"
其实是通过"dispatcher"名字,引用了一个类,此类的名字可以在struts-default.xml文件中找到,并进一步查看此类的定义-->
<result name="success" type="dispatcher">/1.jsp</result>
</action>
</package>
四、Struts2提供的常量在struts2-core-2...jar的org.apache.struts2–>default.properties文件中
要覆盖这些常量:在struts.xml中通过
<constant name="struts.enable.DynamicMethodInvocation" value="false" /><!-- 动态方法调用 true就允许动态调用, false不允许-->
<constant name="struts.devMode" value="true" /><!-- 开发者模式 true, tomcat会打出更详细日志-->
<constant name="struts.action.extension" value="action,,do" /><!-- 将调用时的扩展名改为.do .action 或者不写扩展名-->
<constant name="struts.configuration.xml.reload" value="true"></constant><!-- 自动加载 -->
解决MyEclipse不能提示xml配置文件的方法。s
将\struts-2.3.14.2\src\core\src\main\resources\struts-2.3.dtd拷贝到webRoot\dtds(自定义的文件夹中)
自动显示提示信息的设置:window/Preferences/xml/xmlcatalog/中/add中设置
http://struts.apache.org/dtds/struts-2.3.dtd
五、struts.xml中标签的默认值
<action>
name:动作名称。同一个package中的action的name必须唯一。必须属性
class:指定动作类的全名。默认是:com.opensymphony.xwork2.ActionSupport在<struts-default.xml>中可以找到
method:指定动作类中的动作方法。默认是execute。此方法直接返回SUCCESS,而SUCCESS是Action.class中定义的常量"success"
注意:动作方法必须是public的,返回值是String,没有参数的方法。
<result>
name:结果名称。对应动作类的返回值。默认是success
type:结果类型。默认是dispatcher。
<include file="example.xml"/>:将其它的.xml文件包含进来
动作方法通配符的使用:
<action name="*_*" class="com.wnl.actions.{1}" method="{2}">
<result>/{2}.jsp</result>
</action>
调用方法:Struts/hello/CustomerAction_addCustomer其中:CustomerAction代表{1},addCustomer代表{2}
六、在动作类中获取JavaWeb开发常用的对象
方式一:
ServletActionContext的静态方法
方式二:
使动作类实现相应的接口:
ServletRequestAware
ServletResponseAware
ServletContextAware
实现了以上接口的动作类,在执行方法前,会有一个拦截器负责把相应的对象给你
这个拦截器名称是:servletConfig,对应的实现类是:org.apache.struts2.interceptor.ServletConfigInterceptor