struts2的请求参数url的写法以及相关struts2与Spring集成时的情况

在使用struts2的时候,我们都知道以前的那种以离散的值作为传递的单位,他们的请求url是这么写的: localhost:8080/test/login?username=hello&password=world

以及其对应的action是这么写的

<span style="font-size:24px;">public class LoginAction extends ActionSupport
{
	
	
	private String username ;
	
	private String password ;
          //下面省略对应的getter  setter方法....

          @Override
	public String execute() throws Exception
	{
		//..........一些业务逻辑代码
		return SUCCESS ;
	}

}</span>

然而事实上可以这样写url: localhost:8080/test/login?user.username=hello&user.password=world

<span style="font-size:24px;">public class LoginAction extends ActionSupport
{
	private User user;
          //下面省略对应的getter  setter方法....

          @Override
	public String execute() throws Exception
	{

                  //..........一些业务逻辑代码
		return SUCCESS ;
	}

}</span>
如果这么写struts2可以自动生成一个User对象 ,而User对象里的属性值是便是来自与请求参数url里的值

localhost:8080/test/login?user.username=hello&user.password=world   (user.username=hello&user.password=world)


在这里值得提醒的是如果相应的User对象里的属性没有对应的参数给他复制,则为null。

如果请求参数的url的值多了比如如下请求url写法:http://localhost:8080/test/login?user.username=hello&user.password=world&user.permission=1    ,会抛出如下异常 :

ognl.NoSuchPropertyException: com.test.entity.User.permission





**********************************************************************************************这是一条分割线

顺便多说几句 如果是Spring集成了struts2的话action可以使用Spring的注解驱动。。。。写法如下:

<span style="font-size:24px;">@Controller("login")
@Scope("prototype")
public class LoginAction extends ActionSupport
{
	private User user;
	
	public User getUser()
	{
		return user;
	}

	public void setUser(User user)
	{
		this.user = user;
	}
	
	@Override
	public String execute() throws Exception
	{
		System.out.println(this.user.getUsername());
		
		System.out.println(this.user.getPassword());
		
		System.out.print("user object is null ? answer is" );
		
		System.out.println(this.user == null);
		
		return SUCCESS ;
	}
}
</span>

可以使用@Controller("login")的注解进行驱动,@Scope("prototype")表示的是该action是单例的。

@Controller里的"login"表示的是struts.xml配置文件里的 class属性。

<span style="font-size:24px;"><action name="login" class="login">

</action></span>

同学们,看到这儿是不是想起了struts2的类型转换器!不过我个人认为struts2的类型转换器还是有必要存在的,因为表单提交时产生的url请求格式是以前的那种,即localhost:8080/test/login?username=hello&password=world

当然了,如果你使用javascript脚本的让其产生的url的请求格式变成下面这种也是可以的。

localhost:8080/test/login?user.username=hello&user.password=world

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为什么需要自动生成代码? 作为一个软件公司,开发团队非常重要,作为一个开发团队,人员配备、开发效率等都非常重要,但是开发效率包含很多,如:代码质量(扩展性、重构性等),但是这些都是建立在规范的代码之上来进行,在一个团队,每个开发者都有自己的习惯方式来进行代码的编写,例如(ssh文件名举例): dao接口: 写法一:IXXXDao, 写法二:IXXXDAO 等等 dao实现类: 写法一:XXXHibernateDAO,写法二:XXXHibernateDao,写法三:XXXDAO等等 service接口:写法一:IXXXService,写法二:IXXXManager等等 service实现: 写法一:XXXServiceImpl,写法二:XXXService,写法三:XXXManagerImpl等等 action: 写法一:XXXAction XXXManager等等 还有配置文件的一些注入,以及命名,会有很多种,可能这会有很多人认为只要function体里面的代码逻辑质量高,很规范的运用了面向对象的思想,对逻辑封装的好,性能高,这些规范不规范的有什么问题,影响不了程序的性能,如果你是这样想的,那么我会对你说,你成不了气候,永远都是一个边缘的开发者, 打个比方:一个公司如果没有良好的规章制度,你觉得这个公司好吗? 同样的道理,一个好的项目,没有自己的一套编码规范,是个好的项目吗? 就算在项目开发前定制了规范,也有开发人员因为自己的习惯忘记了定制的规范,按照自己的风格来进行代码编写,这样久而久之,一个项目各种风格的代码都有,对于ssh架构的开发人员每天都会遇到重复的代码编写(当然对重复的代码有可能你会ctrl+c,ctrl+,就算是ctrl+c,ctrl+v也需要花大量的间做些无意义的代码编写,这样降低了开发效率,同好多开发人员对ssh也产生了抵触,认为自己一天到晚都在写些没有用的代码,自己感到很沮丧! 本程序的来源 jsmart 在网上search了这样的插件,以及相关的源码,对jsmart映象比较深,试用该插件后发现功能虽然强大(能够生成各种框架的环境搭建,以及fck等编辑器的初始化),但是发现有很多的规则受限制: 1.每次自动生成的代码都是一次性全部初始化生成,对于二次开发的人员来讲,需要对自己想要指定的单表(数据库表)进行生成(bean,hbm.xml,dao.service,action),该插件无法做到,我想了一下,作者应该会考虑到这一点吧,因此询问该作者后,他说要购买企业版,能够达到该功能 2.定制了自己的数据库规范, 该插件对数据库表进行了限制,如:数据库表名不能带有_(下划线),字段名也不能带有,这点我是最受不了的,不想多说了,从这点,我也就没有继续往下试了. rapid-framework 经过再三的筛选,最后选择了一个开源的框架rapid-framework,如果想要进行全新开发一个项目,又想快速的初始化项目,那么rapid-framework 因为本人仅限于生成自己定制的模版文件,然后自动生成,并非想自动生成整个项目,所以对该项目的部分代码进行了解读,并对需要使用的类提取到自己的项目,然后对自己需要的定制作了相应的修改,完成了一个自动生成的程序. 生成代码后的目录结构如下: com.bestsoft.ssh目录下的 bean/{自定义的存放包}目录: bean文件、hbm.xml文件 dao/{自定义的存放包}目录:接口类 dao/hibernate/{自定义的存放包}目录:实现类 service/{自定义的存放包}目录:接口类 service/impl/{自定义的存放包}目录:实现类 action/{自定义的存放包}目录:struts2的类 conf目录下的 {自定义的存放包}目录:4个xml文件(applicationContext-dao.xml(dao注入配置),applicationContext-service.xml(service注入配置),action-servlet.xml(action注入配置),struts-{自定义的存放包名}.xml(struts2的action配置文件)) 以上是根据我自己项目目录以及代码需要自动生成哪些内容而自己定制的,包括类的方法等自己都可以定制. 实现技巧: generator\template\src\conf\${subpackage}下的文件实现: generator\template\src\conf\${subpackage}\目录下有8个xml文件,4个配置文件是带有xml文件头信息的,4个配置文件不带头文件信息,也就是说这4个文件是标准的配置文件,还有4个是非标准的(文件名带有-insert的)。 配置文件的作用: 标准的配置文件是在第一次生成代码的候调用,来生成一个完整的配置文件的内容,如果说想在此配置文件的内容增加内容,怎么办? 大家可以看到,标准的4个配置文件都带有“<!-- webapp-generator-insert-location -->”这样的注释,该注释的主要作用是用来在该配置文件原有内容的基础上增加新的内容,但是这个新增加的内容从哪里来? 这些内容就是从带"-insert"的配置文件来,把带"-insert"的配置文件内容加入到不带“insert”的配置文件去。 generator\template\src\${basepackage_dir}目录下的文件实现: generator\template\src\${basepackage_dir}\bean 该目录下文件定制bean,以及or/map文件的模板 generator\template\src\${basepackage_dir}\dao 该目录下文件定制dao文件的模板 generator\template\src\${basepackage_dir}\service 该目录下文件定制service文件的模板 generator\template\src\${basepackage_dir}\web\action\${subpackage} 该目录下文件定制action文件的模板。 上述文件模板的内容可以根据自己的需求来作相应功能的增加,修改等 generator\src目录下的文件实现: generator.properties文件:配置信息,大家可以看到我们的目录或者模板文件含有${}的符号,这些${}的内容就是在这里进行配置的. GeneratorMain.java(该类用来传入一个参数:"表名(数据库表)",然后就会生成想要生成的模版),Generator.java(该类实现想要定制哪些模版文件来进行生成,生成后的文件存放在哪里),generator.properties(配置自己的数据库信息,存放包的信息等),template目下的所有文件(该目录下存放的是模版文件,用来只自定义自己想要生成类,xml文件的模版内容)。 红色部分的类可能是你要进行修改的类,其他包的类大家一看就知道是做什么用的. 附件是该程序的代码,该程序只是一个demo,提供了解决该问题的方法,每个项目定制自动生成代码的内容都不一样,但是只需要在该demo的基础上做相应的修改,就可以实现自己想要的内容, 如果还有不清楚的地方,可以留言给我,我会针对留言来进行回复,因为该demo只对ssh2做了程序自动生成,如果该demo无法满足你更多的需要,可以在网上搜索rapid-framework框架,来进行更多框架的代码自动生成.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值