关闭

Struts2---Action

标签: Struts2action类型转换器
66人阅读 评论(0) 收藏 举报
分类:

一、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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:802次
    • 积分:122
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类