一、搭建Struts2的环境
1.1加入jar包
Struts2/apps/struts2-blank/WEB-INF/lib下的所有jar包到当前web应用的lib目录下
1.2在web.xml文件中配置struts2
复制Struts2/apps/struts2-blank/WEB-INF/web.xml文件中的过滤器的配置到当前web应用的web.xml文件中
<!-- 配置Struts2的Filter --> <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> |
1.3 在当前web应用的classpath下添加struts2的配置文件struts.xml中
复制struts/apps/struts2-blank/WEB-INF/class下的struts.xml文件到当前web应用的src下
1.4 关联约束文档DTD
Window——>preference——>XML Catalog——>add(KeyType选择URI复制struts中的key)——>FileSystem(F:\研二\JAVAWEB\struts-2.3.31\src\core\src\main\resources\struts-2.3.dtd)——>struts.xml有提示
二、实现HelloWord
2.1 index.jsp
<a href=”product-input.action”>Product Input</a> |
2.2编写struts.xml
http://localhost:8080/contextPath/namespace/actionName.action
<!-- package:包。struts2使用package来组织模块。 name属性:必须。方便其他的包继承 extends:同java中的继承。同城继承struts-default --> |
<package name="helloWorld" extends="struts-default" namespace=”/”> <!-- 配置一个action:一个struts2的请求就是一个action --> <action name="product-input"> <result>/WEB-INF/pages/input.jsp</result> </action> <action name="product-save" class="com.atguigu.struts2.helloworld.Product" method="save"> <result name="details">/WEB-INF/pages/details.jsp</result> </action> </package> |
2). 不需要显式的定义 Filter, 而使用的是 struts2 的配置文件. 3). details.jsp 比先前变得简单了. ${requestScope.product.productName} -> ${productName} |
2.3 Product.java
private Integer productId; private String productName; private String productDesc; private Double productPrice; public String save() { return "details"; } |
2.4 pages中的input.jsp和details.jsp
<form action="product-save.action" method="post"> ProductName:<input type="text" name="productName"/> <br><br> ProductDesc:<input type="text" name="productDesc"/> <br><br> ProductPrice:<input type="text" name="productPrice"/> <br><br> <input type="submit" value="Submit"/> <br><br> </form> |
ProductId:${productId} <br><br> ProductName:${productName} <br><br> ProductDesc:${productDesc} <br><br> ProductPrice:${productPrice} <br><br> |
三、默认值
<package name="helloWorld" extends="struts-default"> <!-- 配置一个action:一个struts2的请求就是一个action --> <action name="product-input"> <result>/WEB-INF/pages/input.jsp</result> </action> <action name="product-save" class="com.atguigu.struts2.helloworld.Product" method="save"> <result name="details">/WEB-INF/pages/details.jsp</result> </action> </package> |
1. 默认namespace
<package name="helloWorld" extends="struts-default" namespace=”/”> |
http://localhost:8080/contextPath/namespace/actionName.action
2.默认action和result
<action name="product-input" class="com.opensymphony.xwork2.ActionSupport" method="execute"> <result name="success" type="dispatcher"> /WEB-INF/pages/input.jsp </result> </action> |
type="dispatcher" 转发 |
四、action和 Action 类
1). action: 代表一个 Struts2 的请求.
2). Action 类: 能够处理 Struts2 请求的类. ——>Product
> 属性的名字必须遵守与 JavaBeans 属性名相同的命名规则.
> 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生
> 必须有一个不带参的构造器: 通过反射创建实例
> 至少有一个供 struts 在执行这个 action 时调用的方法
> 同一个 Action 类可以包含多个action 方法.
> Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例, 即 Action 不是单例的, 是线程安全的.
五、在 Action 中访问 WEB 资源:
1). 什么是 WEB 资源 ?
HttpServletRequest, HttpSession,ServletContext 等原生的 Servlet API。
2). 为什么访问 WEB 资源?
B\S 的应用的Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie, 获取 realPath....
3). 如何访问 ?
I. 和 Servlet API 解耦的方式: 只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效...).
> 使用 ActionContext
public String execute() {
//0.获取ActionContext对象 ActionContext actionContext = ActionContext.getContext(); //1.获取application对应的Map Map<String, Object> applicationMap = actionContext.getApplication(); //设置属性 applicationMap.put("applicationKey", "applicationValue"); //获取属性 Object date = applicationMap.get("date"); System.out.println("date="+date); //2.session Map<String, Object> sessionMap = actionContext.getSession(); sessionMap.put("sessionKey", "sessionValue"); //3.request(与其他不同) Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request"); requestMap.put("requestKey", "requestvalue"); //4.获取请求参数对应的Map,并获取指定参数值 //parameters只能读不能写,写也不出错 Map<String,Object> parameters = actionContext.getParameters(); System.out.println("parameters是"+((String[])parameters.get("name"))[0]); //不行 parameters.put("age", 100); return "success"; } |
> 实现 XxxAware 接口
见Struts2-3 |
> 选用的建议:若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用Aware 接口的方式
> session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!
if(sessionMapinstanceof SessionMap){ SessionMap sMap = (SessionMap)sessionMap; sMap.invalidate(); System.out.println("session失效了"); } |
II. 和 Servlet API 耦合的方式: 可以访问更多的 Servlet API 对象, 且可以调用其原生的方法.
> 使用 ServletActionContext
HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = ServletActionContext.getRequest().getSession(); ServletContext servletContext = ServletActionContext.getServletContext(); System.out.println("execute..."); |
> 实现 ServletXxxAware 接口.
六、关于 Struts2 请求的扩展名问题
1).org.apache.struts2 包下的default.properties 中配置了 Struts2 应用个的一些常量
2).struts.action.extension 定义了当前 Struts2 应用可以接受的请求的扩展名.
3). 可以在 struts.xml 文件中以常量配置的方式修改default.properties 所配置的常量.
<constant name="struts.action.extension" value="action,do,"></constant> |
七、ActionSupport
1).ActionSupport 是默认的 Action 类: 若某个 action 节点没有配置 class 属性, 则 ActionSupport 即为待执行的 Action 类. 而 execute 方法即为要默认执行的 action 方法
<actionname="testActionSupport">
<result>/testActionSupport.jsp</result>
</action>
等同于
<actionname="testActionSupport"
class="com.opensymphony.xwork2.ActionSupport"
method="execute">
<result>/testActionSupport.jsp</result>
</action>
2). 在手工完成字段验证, 显示错误消息, 国际化等情况下, 推荐继承 ActionSupport.
八、result:
1). result 是 action 节点的子节点
2). result 代表 action 方法执行后, 可能去的一个目的地
3). 一个 action 节点可以配置多个 result 子节点.
4). result 的name 属性值对应着 action 方法可能有的一个返回值.
<resultname="index">/index.jsp</result>
5). result 一共有 2 个属性, 还有一个是 type: 表示结果的响应类型
6). result 的 type 属性值在 struts-default 包的 result-types 节点的 name 属性中定义.
常用的有
> dispatcher(默认的): 转发. 同 Servlet 中的转发.
> redirect: 重定向
>redirectAction: 重定向到一个 Action
注意: 通过redirect的响应类型也可以便捷的实现redirectAction 的功能!
<result name="index"type="redirectAction">
<paramname="actionName">testAction</param>
<paramname="namespace">/atguigu</param>
</result>
OR
<result name="index"type="redirect">/atguigu/testAction.do</result>
> chain: 转发到一个 Action
注意: 不能通过 type=dispatcher 的方式转发到一个 Action
只能是:
<result name="test"type="chain">
<paramname="actionName">testAction</param>
<paramname="namespace">/atguigu</param>
</result>
不能是:
<resultname="test">/atguigu/testAction.do</result>