SpringMVC基础配置(二)
上一张:springmvc环境搭建(一)
今天我们来说说springmvc的基础配置。目前越来越多的主流框架都支持注解,同时我们无敌的spring也支持基于注解的"零配置"。
注解相比xml的优势:它可以充分利用java的反射机制获取类中的结构信息,这些信息可以有效减少配置的工作,注释和java代码位于一个文件中,更加利于维护。
注意:必须要在spring2.5版本之后才可以使用注解方式。
注解方式将bean的定义信息和bean的实现类结合在一起,spring提供的注解有。
@component:声明一个普通的bean类
@repository:声明一个持久层dao类
@service:声明一个业务层类
@controller:声明一个控制器类
这4个注解相信小伙伴们已经非常的熟悉了,废话就少说了。我们使用注解千万不要忘了在类中扫描!!!
@requestmapping(非常核心的一个注解),这个注解是用来指定控制器的请求url。
在控制器的类定义:提供初步的映射信息,为该类下所有请求方法添加一个前缀。
在控制器类中的方法定义:提供进一步的映射信息,提供方法的请求路径
dispacherservlet截获请求后,就通过 控制器上的@requestmapping提供的映射信息确认请求所对应的处理方法。
@controller @requestmapping("user") public class usercontroller { @requestmapping("/hello") public string hello(){ return "hello"; } }
这个时候我们请求的路径是http://localhost:8080/springmvcdemo2/user/hello
@requestmapping除了映射请求url请求,还可以使用请求方法,请求参数和请求头的请求,注解中有几个参数:
1)value:表示请求的url
2)method:表示请求的方式(get/post)
3)params:表示请求的参数
4)heads:请求头
他们之间的是与的关系,联合使用多个请求可以让请求更加的精确化。
@requestmapping(value="hello2",method=requestmethod.post,params={"username","userpass"},headers="contenttype=text/*") public string hello2(){ return "hello"; }
这段代码表示,请求的地址是hello请求方式为post必须带username,userpass两个参数,请求头contenttype必须是text/开头。我们可以写两个url一样的方法,请求方式一个post另一个get当时会严格根据设置进行调用
@requestmapping同时还支持ant风格的url,在ant中支持3种通配符。
?:表示配置一个字符。
*:匹配任意字符
**:匹配多层路径
在springmvc中对参数的处理:
@pathvariable:url模板方式
用来映射url中的占位符,映射的变量名必须和占位符中的名称一致,像这种我们的请求地址就会时http://localhost:8080/springmvcdemo2/user/testpathvariable/miya,这个miya就是我们传过去的参数,在传统的url中testpathvariable?username=miya但是这种不利于百度的收录。
@requestmapping("/testpathvariable/{username}") public string hello3(@pathvariable("username")string username){ system.out.println("username : " + username); return "hello"; }
@requestparam:获取请求参数,如果请求参数名字和类型的名字一致我们可以省略吊这个注解,一样可以接受到值。
@requestmapping("/textparam") public string hello4(@requestparam("username")string username,@requestparam("userpass")string userpass){ system.out.println("userpass : " + userpass); return "hello"; }
@requestheader:获取请求头的参数
在这里有三个参数,value:指定参数的名称,required:指定参数是否为必填,defualtvalue:指定参数的默认值。
@requestmapping("/testrequestheader") public string hello5(@requestheader("accept-language") string language){ system.out.println("language=" + language); return "hello"; }
@cookievalue:用来获取客户端cookie的信息。
@requestmapping("/testcookievalue") public string hello6(@cookievalue("jsessionid")string sessionid){ system.out.println("sessionid=" + sessionid); return "hello"; }
springmvc可以使用servletapi作为请求方法的参数
@requestmapping("/testservletapi") public string hello7(httpservletrequest request,httpservletresponse response,httpsession session){ //我们可以在这里使用 return "hello"; }
springmvc提供了以下几种处理模型数据的方式。
1)modelandview:将处理方法的返回类型设置为modelandview方法体可通过该模型对象添加模型数据。既包含视图,也包含模型信息
@requestmapping("/testmodelandview") public modelandview hello8(){ modelandview modelandview = new modelandview("hello"); //添加单个值 modelandview.addobject("h","hello spring mvc"); return modelandview; }
2)map及形参:当形参为map,model,modelmap时,处理方法返回时,map中的数据会自动添加到模型中。
spring mvc在内部使用了一个model接口存储数据的数据,在调用方法前会创建一个隐含的模型对象作为数据模型的存储容器。如果传入的参数为map,model,modelmap时,springmvc会自动保存到容器中
@requestmapping("/testmap") public string hello9(map<string,object> map){ map.put("mapdata", "map data"); return "hello"; }
3)@sessionattributes:将这个模型中的某个属性存储到session中,以便多个请求之间共享这个属性,只能用来修饰类。在里面的方法如果参数容器中如map里卖弄保存一个与定义的属性名字相同会保存到容器*享
4)@modelattribute:方法形参标记该注解后,形参对象就会放到模型中。
springmvc在调用方法之前会逐个调用方法上标注了这个注解的方法。将@modelattribute中的属性保存到map中,可在执行表单提交生成对象之前,替换执行方法名相同的参数。
@modelattribute public user getuser(){ user user = new user(); system.out.println("调用 getuser 方法"); //默认保存名字为类名首字母小写的user对象到request中 return user; } @modelattribute public void getuserbyid(integer id,map<string,object> map){ user myuser = new user(); map.put("myuser", myuser); //手动指定user对象的名称,到request中 system.out.println("调用 getuser 方法"); }
由@sessionattributs会引发一个很容易轻视的错误当类使用@sessionattributes修饰,而方法中使用了和sessionattributes修饰同名的映射参数,确没有添加@modelattribute修饰时,则会报错。