配置struts.xml文件
struts.xml是Struts2框架的核心配置文件,主要用来配置Action和请求的对应关系,以及配置逻辑视图和物理视图资源的对应关系
<struts>
是根元素
<constant>
用于常量配置
<package>
用于包配置,包用来组织Action和拦截器等,每个包都是零个及以上个拦截器以及Action所组成的集合
<include>
用于在一个struts.xml配置文件中包含其他配置文件
<!--设置默认编码集为UTF-8-->
<constanst name="struts.il8n.encoding" value="UTF-8" />
<!--设置使用开发者模式-->
<constanst name="struts.devMode" value="true" />
常量配置
Struts2常量配置通常采用三种方式
*在struts.xml文件中使用<constant>
元素来配置常量
<!--设置默认编码集为UTF-8-->
<constant name="struts.il8n.encoding" value="UTF-8"/>
<!--设置使用开发模式-->
<constant name="struts.devMode" value="true"/>
<!--name属性指定常量名,value实行指定常量值,两者都是必填属性-->
*在struts.properties中配置常量(key-value形式)
.properties中能配置的常量都可以在struts.xml中使用constant元素来配置
###设置action请求的扩展名为action或者没有扩展名
struts.action.extension=action,,
###设置不开启动态方法调用
struts.enable.DynamicMethodInvocation=false
*在web.xml文件中通过<inti-param>
元素配置常量
在web.xml中配置核心过滤器StrutsPrepareAndExecuteFilter时,通过初始化参数来配置常量
<filter>
...
<init-param>
<param-name>struts.il8n.encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
包配置
Struts框架使用包来管理核心组件–Acion和拦截器,每个包就是多个Action,多个拦截器,多个拦截器引用的集合。
name 必填属性,它指定该包的名字,此名字是该包被其他包引用的key。
namespace 可选属性,定义包的命名空间,默认为空,“/”
extends 可选属性,它指定该包继承自其他包。一般都写上,内容为 “struts-default”。这样该包就中的Action就具有了Strurs框架默认的拦截器功能。
abstract 可选属性,它指定该包是否是一个抽象,抽象包中不能包含Action定义
包含配置
<include>
元素用来在一个struts.xml配置文件中包含其他配置文件,包含配置体现的是软件工程中的分而治之的原则
<struts>
<!--包含了4个配置文件-->
<!--不指定路径,默认在src下的方式-->
<include file="struts-shop.xml"/>
<include file="struts-user.xml"/>
<include file="struts-shoppingcart.xml"/>
<!--配置文件在具体包中时的方式->
<include file="cn/itcast/action/struts-product.xml"/>
</struts>
Action的配置
实现action控制类
Action作为框架的核心类,实现对用户请求的处理,Action类被称为业务逻辑控制器。Action用来处理一次用户请求的对象
POJO的实现
在Struts2中,Action可以不继承特殊的类或者实现任何特殊结构,仅仅是一个POJO(Plain Ordinary Java Object)—具有一部分getter/setter方法,一般要有一个公共的无参构造方法和一个execute()方法
public Sting execute() thorws Exception{ return “success” }
实现Action接口
Action接口具体代码
package com.opensymphony.xwork2;
public interface Aciton{
//定义Action接口里包含的一些结果字符串
public static final String SUCCESS="success";
public static final String NONE="none";
public static final String ERROR="error";
public static final String INPUT="input";
public static final String LOGIN="login";
//定义用户请求的execute()方法
public String execute() thorws Exception;
}
继承ActionSupport类
由于Action接口简单,帮助太小所以通常都是继承ActionSupport类。
import com.opensymphony.xwork2.ActionSupport;
publi class LoginAction extends ActionSupport{
@override
public String execute() thorws Exception{
return super.execute();
}
}
ActionSupport类还实现了Validateable、ValidationAware、TextProvider、LocaleProvider和Serializable(因为继承该接口的类都必须声明变量private static final long serialVersionUID=1L;)等接口
配置Aciton
<!-- 定义action,该action对应的类为cn.itcast.action.UserAction类 -->
<action name="userAction" class="cn.itcast.action.UserAction">
<!-- 定义处理结果和视图资源之间的映射关系 -->
<result name="success">/success.jsp</result>
</action>
使用通配符
<package name="user" namespace="/user" extends="struts-default">
<action name="userAction_*"
class="cn.itcast.action.UserAction" method="{1}">//匹配第一个星花
<result>/*.jsp</result>//假如客户端发送/user/userAction_login.action请求时,<action>会变成userAction_login,method属性会设置成login,同样也会跳转到login.jsp
</action>
</package>
Action访问Servlet API
通过ActionContext类访问
ActionContext是Action执行的上下文对象,其中保存了Action执行所需要的所有对象,包括parameters,request,session,application等。推荐使用此方式。
ActionContext context=ActionContext.getContext();
context.put("name","itcast");//在request中放kv对
context.getApplication().put("name","itcast");//在Application中放kv对
context.getSession().put("name","itcast");//在Session中放kv对
通过特定接口访问
ActionContext可以访问但是无法直接获得Servlet API实例。
ServletRequestAware:实现该接口的Action可以直接访问Web应用的HttpServletRequest实例
ServletResponseAware:实现该接口的Action可以直接访问Web应用的HttpServletResponse实例
SessionAware:实现该接口的Action可以直接访问Web应用的HttpSession实例
ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例
AwareAction.java
public class AwareAction extends ActionSupport implements ServletRequestAware{
HttpServletRequest request;
//获得HttpServletRequest实例
@override
public void setServletRequest(HttpServletRequest request){
this.request=request;
}
@override
public String execute() throws Exception{
request.setAttribute("message","通过ServletRequestAware接口实现了访问Servlet API");
return SUCCESS;
}
}
AwareAction类必须实现setServletRequest方法(得到HTTPServletRequest实例)跟execute方法,页面访问:${requestScope.message}
通过ServletActionContext访问
直接访问Servlet API
static HttpServletRequest getRequest():获取Web应用的HttpServletRequest对象
static HttpServletResponse getResponse():获取Web应用的HttpServletResponse对象
static ServletContext getServletContext():获取Web应用的ServletContext对象
static PageContext getPageContext():获取Web应用的PageContext对象
MessageAction.java
public class MessageAction extends ActionSupport{
@override
public String execute() throws Exception{
ServeltActionContext.getRequest().setAttribute("message","通过ServletActionContext类直接访问Servlet API");
return SUCCESS;
}
}
Action处理请求参数
属性驱动
属性驱动是指通过字段进行数据传递,包括两种情况:
基本数据类型字段驱动方式的数据传递
public class UserAction{
private String username;//需要对应登录页面的用户名
private String password;
//getter,setter省略
execute();//execute方法省略
}
直接作用域对象字段驱动方式的数据传递
把属性和对应的getter/setter方法从Action提取出来,单独作为一个域对象,用来封装这些数据。
采用这种方式一般以JavaBean来实现,所封装的属性和表单的属性一一对应,JavaBean将成为数据传递的载体
public class User{
private String username
//省略getter setter
}
UserLoginAction.java
public class UserLoginAction extends ActionSupport{
private User user;
//省略user属性的getter/setter
public String execute() throws Exception{
ActionContext context=ActionContext.getContext();
if("itcast".equals(user.getUsername())&&"123"..equals(user.getPassword()){
//将用户名和密码放到session中
context,getSession().put("username",user.getUsername());
}
return SUCCESS;
}
}
userLogin.jsp
<form name="form1" action="userlogin.action" method="post">
<input type="text" name="user.username">
</form>
使用域对象的属性驱动方式传值时,如果JSP页面时负责取值的,那么取值格式必须为“对象.属性名”
如果JSP页面时负责传值的,那么传值的格式可以为“模型对象名.属性名”,也可以为“属性名”
模型驱动
通过实现ModelDriven接口来接受请求参数,Action类必须实现ModelDriven接口,并且重写getModel(),返回Action所使用的数据模型对象
模型驱动方式通过JavaBean模型进行数据传递,封装的属性与表单的属性一一对应
public class UserLoginAction extends ActionSupport implements ModelDriven<User>{
private User user=new User();
public User getModel(){
return user;
}
public String executer() throws Exception{
return SUCCESS;
}
}
userLogin.jsp
<input type="text" name="username">//使用ModelDriver的方式,一个Action只能对应一个Model。因此不需要添加前缀。
Result结果类型
使用来配置Result逻辑视图与物理视图之间的映射
name属性,可选,逻辑视图的名称,默认为success
type属性,可选,返回的视图资源类型,默认为dispatcher
<result name="success" type="dispatcher">
<param name="location">/success,jsp</param>//parse属性指定在资源视图名称中是否可以使用OGNL表达式。默认为true
</result>
绝对路径要以斜杠开头,相当于Web应用程序的上下文路径