value="org.springframework.web.servlet.view.JstlView"/>
上面这个文件,我们定义了一个component-scan
base-package="com.pango.spring.helloworld.controller"/>
这样的标签,定义了这个后,当spring在启动时,会加载com.pango.spring.helloworld.controller这个包底下及子包底下的所有的组件(这就包的自动扫描机制,即spring会将标有@Controller@Component等类加载到spring容器管理中),后面我们还定义了class="org.springframework.web.servlet.view.UrlBasedViewResolver">
value="org.springframework.web.servlet.view.JstlView"/>
ViewResolver是一个试图解析器,就是我们第一部分提到的springMVC生命周期中的第五步,上面这段的配置的意思就是,当我们从后端控制器中返回的视图时,前端控制器就根据这一段配置来返回一个具体的视图,如后端控制返回的是一个hello,根据上面的配置,最后前端控制器会组并成这样的一个地址:
/web-inf/jsp/hello.jsp,然后从/web-inf/jsp/这个目录下面查找一个hello.jsp返回客户端。
第三部分我们看我们写得HelloworldController后台控制器。
(3)在包底下写一个HelloWorldController的类,其内容如下:
@Controller
publicclassHelloWorldController{
@RequestMapping(value="/hello")
publicStringsayHello(ModelMapmodelMap){
modelMap.put("sayHello","helloworld");
return"/hello";
}
}
在这里简单介绍下上面的配置,后面我们会详细讲解各个参数:
ØController即声明这个类是一个控制器,上面第二部分我们说明了,只要加了@Controller标示的,spring会通过自动扫描机制,将这个类纳入spring容器管理中。
Ø@RequestMapping(value="/hello"),这个定义的就是一个请求路径,只要符合/hello路径的多会交给这个控制器的sayhello方法来处理。
Ø最后我们返回/hello的视图给客户端。
(4)好了,大功告成,我们再在web-info/jsp/目录下添加一个hello.jsp文件,就可以启动运行我们的第一个程序了。
hello.jsp的内容如下:
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<%@tagliburi="prefix="c"%>
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
Inserttitlehere
${sayHello}
运行后访问ip;port/project/hello.html就可以看到我们预期的结果了。
四、springMVC参数传递
mvc结构中,v层不断有数据和c层交互,所以弄明白在springMVC中如何与后台进行数据交互是极其重要的,当然在下面我不会介绍每一个方法,只是对常用的方法,对于我这里没有涉及的方法大家可以参考spring官方的文档中springMVC这个章节。
下面我们来看一幅图。
当我们向springMVC发起请求到视图返回前,springMVC帮我们做了主要是上面几个步骤,通过数据绑定、数据类型转换、验证、结果绑定这几个步骤。
让我们看下实例:
@RequestMapping("/user/find")
publicStringfindUserById(@RequestParam("userId")intuserId,ModelMapmodelMap){
modelMap.put("userId",userId);
return"/user";
}
Ø@RequestMapping("/user/find"),是对请求映射的说明,这个注解中主要包含四个属性,分别value、method、params、header,这四个参数分别表示:
Value:
指定路径
Method:
请求方式
Params:
参数
Headers:
请求头
后面三个就是对请求路径的一个限制条件。
SpringMVC对于路径的定义非常的灵活
以下URL都是合法的:
●/user/*/createUser
匹配/user/aaa/createUser、/user/bbb/createUser等URL。
●/user/**/createUser
匹配/user/createUser、/user/aaa/bbb/createUser等URL。
●/user/createUser?
?
匹配/user/createUseraa、/user/createUserbb等URL。
●/user/{userId}
匹配user/123、user/abc等URL。
●/user/**/{userId}
匹配user/aaa/bbb/123、user/aaa/456等URL。
●company/{companyId}/user/{userId}/detail
匹配company/123/user/456/detail等的URL。
Ø对RequestParam的介绍
@RequestParam有以下三个参数。
●value:
参数名。
●required:
是否必需,默认为true,表示请求中必须包含对应的参数名,如果不存在将抛出异常。
●defaultValue:
默认参数名,设置该参数时,自动将required设为false。
极少情况需要使用该参数,也不推荐使用该参数。
当发送请求时,请求参数中必须要包含userId这个参数,当不包含这个参数,请求将找不到这个映射。
当属性required=true时,不包含这个参数将会抛异常,如果不能确定是否需要这个参数是我们可以写成,@RequestParam(value="userId",required=false)。
Ø直接将属性映射到对象中
@RequestMapping("/user/find2")
publicStringfind2UserById(Useruser,ModelMapmodelMap){
modelMap.put("user",user);
return"/user";
}
SpringMVC按:
“HTTP请求参数名=命令/表单对象的属性名”
的规则,自动绑定请求数据,支持“级联属性名”,自动进行基本类型数据转换。
如:
发起下面这个请求,springMVC会自动将id、name、password属性的值填充到user对象中。
http:
//localhost:
8080/springParam/user/save.html?
id=12&name=marcle&password=123
ØSpringMVC以rest技术向springMVC传递参数
通过REST风格体系架构,请求和响应都是基于资源表示的传输来构建的。
资源是通过全局ID来标识的,这些ID一般使用的是一个统一资源标识符(URI)。
客户端应用使用HTTP方法(如,GET、POST、PUT或DELETE)来操作一个或多个资源。
通常,GET是用于获取或列出一个或多个资源,POST用于创建,PUT用于更新或替换,而DELETE则用于删除资源。
例如,GEThttp:
//host/context/employees/12345将获取ID为12345的员工的表示。
这个响应表示可以是包含详细的员工信息的XML或ATOM,或者是具有更好UI的JSP/HTML页面。
您看到哪种表示方式取决于服务器端实现和您的客户端请求的MIME类型。
RESTfulWebService是一个使用HTTP和REST原理实现的WebService。
通常,一个RESTfulWebService将定义基本资源URI、它所支持的表示/响应MIME,以及它所支持的操作。
Spring3.0之后引入了对rest风格的支持。
我们看实例
@RequestMapping("/user/find/{id}")
publicStringrest(@PathVariableintid,ModelMapmodelMap){
Useruser=newUser();
user.setName("marcle");
user.setPassword("123");
user.setId(id);
modelMap.put("user",user);
return"/user";
}
这里需要注意的地方时@RequestMapping("/user/find/{id}")和@PathVariableintid名称必须一样,否则会出现异常。
Ø简单介绍返回视图的方式
◆ModelAndView形式返回
@RequestMapping("/user/save2")
publicModelAndViewsave2(Useruser,ModelMapmodelMap){
ModelAndViewmav=newModelAndView();
mav.setViewName("/user");
mav.addObject("user",user);
returnmav;
}
ModelAndView就是对返回到页面的值和视图进行封装。
◆直接字符串的形式返回,如”return“/user””,再把属性通过modelMap进行封装,modelMap存储的值属于request范围内,如果要发送服务器端请求,springMVC非常方便,你只要这样写即可return”direct:
user”.
还有一种传递参数的方法,我放在springMVC中的rest技术介绍
下面我们看看springMVC返回的过程
五、springMVC标签介绍
SpringMVC简单没几个标签,用起来还是非常好用的,在使用springMVC中的标签之前需要向每个jsp的头部引入标签支持<%@taglibprefix="form"uri="http:
//www.springframework.org/tags/form"%>
。
(1)form标签
这个标签会生成一个HTML的form标签,同时为内部标签的绑定暴露了一个绑定路径,它把命令对象(commandobject)放在pageContext中,这样内部的标签就可以访问这个对象,这个库中的其它标签都是这个标签的嵌套标签。
如我们有个user的域对象,包含id、name、password属性,我们将把它当作返回index.jsp表单控制器的对象,如下面的代码:
formaction="${ctx}/user/save.${ext}"method="post"commandName="user">
Id: | inputpath="id"/> |
name: | inputpath="name"/> |
password: | inputpath="password"/> |
|
form>
上述的id、name、password由页面控制器放置在pageContext中,即在内部控制器方法中需要做这样的声明:
@RequestMapping(value="/user/save",method=RequestMethod.GET)
publicStringforSave(@ModelAttributeUseruser){
return"/index";
}
后台控制器中必须绑定这个@ModelAttributeUseruser命令行对象,而form下面的属性需要于这个user中的属性对应起来,否则将会抛异常。
标签经过解析后生成的代码如下: