Struts2学习笔记(二)

Strut2对于8个原生数据类型以及Date、String等常见类型,Struts2可以使用内建的类型转换器实现自动转换,但是自定义的对象类型来说,需要自己指定类型转换。以下结合具体的Address实例来进行分析。

1)首先在address.jsp页面编写一个文本框,文本框的信息由**省,**市,详细地址构成(由英文字母逗号分隔)。

<body>
<form action="<span style="color:#ff0000;">addressAction.action</span>" method="post">
address:<input type="text" name="address">
<input type="submit" value="submit">
</form>
</body>

2)新建一个Address类

public class Address {
private String province;
private String city;
private String details;
public String getProvince() {
	return province;
}
public void setProvince(String province) {
	this.province = province;
}
public String getCity() {
	return city;
}
public void setCity(String city) {
	this.city = city;
}
public String getDetails() {
	return details;
}
public void setDetails(String details) {
	this.details = details;
}
}

3)然后编写AddressAction类(注意与笔记(一)不同的地方,AddressAction继承了ActionSupport类,然后execute返回SUCCESS)在实际开发中,通常都会继承ActionSupport类,会对子类进行很多辅助的功能。

public class AddressAction extends<span style="color:#ff0000;"> ActionSupport</span> {
private Address address;

public Address getAddress() {
	return address;
}

public void setAddress(Address address) {
	this.address = address;
}
@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return SUCCESS;
	}
}

4)配置struts.xml文件,在package中加入action

<action name="addressAction" class="cn.sict.struts2.AddressAction">
	<result name="success">/output.jsp</result>
	</action>

5)编写结果输出页面output.jsp

<body>
province:${requestScope.address.province}<br>
city:${requestScope.address.city}<br>
details:${requestScope.address.details}
</body>

6)因为这里面Address是我们自定义的对象类型,Struts2无法自动转换。我们需要自己指定转换类型。编写AddressConverter类,进行自定义转换。继承ognl中默认的类型转换器DefaultTypeConverter

public class AddressConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
	// TODO Auto-generated method stub
	if(Address.class==toType)
	{
		String[] addr=(String[])value;
		String firstAddr=addr[0];
		StringTokenizer st=new StringTokenizer(firstAddr,",");
		String province=st.nextToken();
		String city=st.nextToken();
		String details=st.nextToken();
		Address address=new Address();
		address.setProvince(province);
		address.setCity(city);
		address.setDetails(details);
		return address;
	}
	return null;
}
}
7)那如何将我们自定义的类型转化和struts建立联系呢。新建AddressAction-conversion.properties(命名方式是固定的)
address=cn.sict.converter.AddressConverter//AddressAction里面的address属性进行AddressConverter转换

address.jsp页面与output.jsp页面如下:



程序的流程如下:address.jsp页面提交信息-》struts发现Address有自定义的类型转化,到AddressConverter类下,进行相应的类型转换-》将AddressConverter中返回的address类set到AddressAction方法中-》然后通过requestScope显示相应的信息。

总结:对于自定义的类型转化器来说提供了三个信息:1)通过属性文件名AddressAction-conversion.properties获得AddressAction的名字

                                                                                                2)Action中待转换的属性名是通过属性文件的key值获得的。

                                                                                                3)该属性所对应的类型转换器是通过key值所对应的value获得的。

假如在这里,我想输出从后台输出自定义的address对象的详细内容,改写output.jsp,利用struts2的标签库

<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<s:property value="address"/>//访问action中的address属性,返回getAddress()方法,返回之前发现address需要相应的类型转换,先转换再返回。
</body>
正常情况下,会输出address类对应的地址,那我通过改写AddressConverter类,自定义Address输出的类型

public class AddressConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
	// TODO Auto-generated method stub
	if(Address.class==toType)
	{
		String[] addr=(String[])value;
		String firstAddr=addr[0];
		StringTokenizer st=new StringTokenizer(firstAddr,",");
		String province=st.nextToken();
		String city=st.nextToken();
		String details=st.nextToken();
		Address address=new Address();
		address.setProvince(province);
		address.setCity(city);
		address.setDetails(details);
		return address;
	}else if(String.class==toType)//从后台向前端传递(前端显示的一定是String类型)
        {
                Address address=(Address)value;
                String province=address.getProvince();
                String city=address.getCity();
                String details=address.getDetails();
                String addr=province+","+city+","+details;
                return addr;
         }
	    return null;
}
}



注意:该题中存在中文提交乱码问题,详细解决方法参考链接:http://blog.csdn.net/hjw506848887/article/details/8966194


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Struts 中,处理异常有两种方式:编程式异常处理和声明式异常处理。本篇笔记将讲解声明式异常处理。 声明式异常处理是指在 struts.xml 文件中通过配置来处理异常。这种方式可以让开发人员将重心放在业务逻辑的处理上,而不必关心异常的处理。 首先,我们需要在 struts.xml 文件中配置全局的异常处理: ```xml <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="errorPage"/> </global-exception-mappings> ``` 这里我们配置了一个全局的异常处理,它会处理所有的 java.lang.Exception 异常,并将结果返回到名为 errorPage 的 result 中。 接下来,我们需要在 action 中声明需要处理的异常: ```xml <action name="test" class="com.example.TestAction"> <exception-mapping exception="java.lang.IllegalArgumentException" result="illegalArgument"/> <result name="success">/test.jsp</result> </action> ``` 在这个例子中,我们声明了 TestAction 类中处理 java.lang.IllegalArgumentException 异常,并将结果返回到名为 illegalArgument 的 result 中。 最后,我们需要在 struts.xml 文件中定义这些 result: ```xml <result name="errorPage">/error.jsp</result> <result name="illegalArgument">/illegalArgument.jsp</result> ``` 这样,当 TestAction 类中抛出 java.lang.IllegalArgumentException 异常时,就会返回到名为 illegalArgument 的 result 中。 总之,声明式异常处理可以让我们更加专注于业务逻辑的处理,通过配置来处理异常,从而提高代码的可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值