Struts2---Action

一、Action的定义
1、Action定义的三种方式:
(1)普通的一个类,其中必须要有一个方法:
public String execute() throws Exception{}
(2)实现Action接口,覆盖其中的execute()方法;
(3)继承ActionSupport类,覆盖execute()方法;ActionSupport中定义了几个字符串常量;
注意:表单的属性名和action类的set方法有关系,和action中的属性名没有关系;


2、Action的配置:
当用户发出请求后,首先通过在web.xml中配置的拦截器进行拦截后,接下来再struts.xml文件中进行查找业务逻辑的action;
Action配置在struts.xml文件中,struts2使用package来管理action,action是配置在package下的一个子元素。


3、Action的动态方法调用
方法1:直接指定要调用的方法,格式如下:
ActioName!methodName.action
  例如:<a href="<%=path%>/user!login.action>Login</a>
  user为action的名字,login为action类中被调用的方法名;
方法2:为action元素指定method属性,同一个action类对应多个逻辑action配置;
  例如:
  <package name="example" extends="struts-default" >
<action name="userLogin" class="com.my.action.LoginAction" method="login" >
<result name="success">/WEB-INF/pages/login/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
<action name="userRegister" class="com.my.action.LoginAction" method="register" >
<result name="success">/WEB-INF/pages/login/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
方法3:通配符
  action元素的name、class和method属性都可以指定通配符;
  例如:
<package name="example" extends="struts-default" >
<action name="*Action" class="com.my.action.LoginAction" method="{1}" >
<result name="success">/WEB-INF/pages/login/success.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
注释:只要求请求复合*Action.action模式,该action就会处理;
  若请求是registerAction.action,则调用action中的register方法;
  若请求时loginAction.action,则调用action类中的login方法。


二、类型转换器
struts2的类型转换器是基于OGNL的,在OGNL中有一个TypeConverter接口;
1、struts2提供了内置的类型转换器:boolean和Boolean、char和Character、int和Integer、long和Long、double和Double、float和Float、Date;
2、自定义类型转换器
方法1:实现ognl中的TypeConverter接口,其中有一个方法convertValue方法,该方法过于复杂;
方法2:使用DefaultTypeConverter类,该类实现了TypeConverter接口,并提供了一个简化的convertValue方法;
public Object convertValue(Map map, Object obj, Class toType){}
  参数map是表示OGNL上下文的Map对象,obj是需要转换的对象,toType是要转换的目标类型。
  例如:
   public class PointConverter extends DefaultTypeConverter
   {
@Override
public Object convertValue(Map map, Object obj, Class toType)
{
if(toType == Point.class)
{
String[] strs = (String[]) obj;
String[] xy = strs[0].split(",");
Point p = new Point();
p.setX(Integer.parseInt(xy[0]));
p.setY(Integer.parseInt(xy[1]));
return p;
}
else if(toType == String.class)
{
Point p = (Point) obj;
return "["+p.getX()+","+p.getY()+"]";
}
else
{
return null;
}
}

   }

方法3:stuts2提供了一个strutsTypeConverter抽象类,该类继承类DefaultTypeConverter,通过它更为简洁;
例如:
public class PointConverter extends strutsTypeConverter
{
@Override
public Object convertFromString(Map map, String[] obj, class toType)
{
String[] strs = (String[]) obj;
String[] xy = strs[0].split(",");
Point p = new Point();
p.setX(Integer.parseInt(xy[0]));
p.setY(Integer.parseInt(xy[1]));
return p; 
}

@Override
public String converterToString(Map map, Object obj)
{
Point p = new Point();
return "["+p.getX()+","+p.getY()+"]";
}

}
3、配置类型转换器(类型转换器实现)
  方法1:局部 (该文件放在action类所在的目录下面)
命名:ActionName-conversion.properties
内容:属性=类型转换器
 例如:point=com.my.action.PointConverter
方法2:全局 (该文件放在src目录下面)
命名:xwork-conversion.properties
内容:属性类型=类型转换器
 例如:com.my.bean.Point=com.my.action.PointConverter
 
4、struts2的类型拦截器错误处理



三、Action中访问Servlet API


方法1:ActionContext
(1) Object get(Object obj);相当于HttpServletRequest对象的getAttribute方法;
(2) Map getApplication(); Map中保存ServletContext作用域的对象;
(3) static ActionContext getActionContext(); 该静态方法返回ActionContent实例;
(4) Map getParameters(); 该方法和HttpServletRequest对象的getParamterMap方法对应;
(5) Map getSession(); Map中保存的是session作用域内的对象;
例如:
ActionContext ac = ActionContext.getActionContext();
Map<String, Object> session = ac.getSession();
session.put("user1", user);

方法2:实现如下的接口
(1)ServletContextAware 通过以来注入可以得到ServletContext对象;
(2)ServletRequestAware 通过以来注入可以得到HttpServletRequest对象;
(3)ServletResponseContextAware  通过以来注入可以得到HttpServletResponse对象;
例如:
public class LoginAction2 extends ActionSupport implements ServletRequestAware, ServletResponseAware
{
public HttpServletRequest request;
public HttpServletResponse reponse;

@Override
public String execute() throws Exception
{
if(username != null && username.equals("amake"))
{
HttpSession session = request.getSession();
session.setAttribute("username", username);
return SUCCESS;
}
this.setTip("用户名密码错误");
return INPUT;
}


@Override
public void setServletRequest(HttpServletRequest request)
{
this.request = request;



@Override
public void setServletResponse(HttpServletResponse response)
{
this.reponse = response;
}

private String username;
private String password;
private String tip;

public String getUsername()
{
return username;
}


public void setUsername(String username)
{
this.username = username;
}


public String getPassword()
{
return password;
}


public void setPassword(String password)
{
this.password = password;
}

public String getTip()
{
return tip;
}


public void setTip(String tip)
{
this.tip = tip;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值