annotation-driven/>
--支持spring3.0新的mvc注解-->
--启动SpringMVC的注解功能,完成请求和注解POJO的映射-->
其中schemaLocation和xmlns建议直接拷贝。
7、创建UserController如下:
@Controller
@RequestMapping("/user.do")
publicclassUserController{
@RequestMapping(params="method=add")
publicStringaddUser(Modelmodel){
model.addAttribute("message","添加了一个用户");
System.out.println("UserController.addUser()");
return"/WEB-INF/jsp/addsuc.jsp";
}
}
其中@RequestMapping("/user.do")的配置是指:
该controller的请求url为:
user.do
@RequestMapping(params="method=add")的注解是指:
凡是请求的url为:
user.do而带了参数method=add的请求会由方法addUser来处理。
addUser的形参model为后续讲解内容。
return"/WEB-INF/jsp/addsuc.jsp";是告诉spring完成处理之后直接进入该视图。
8、添加对应的页面,测试请求user.do?
method=add
一、servlet3.0之后基于annotation文件的配置。
参考程序:
102SpringMVC_servlet3.x_controller
servlet3.0之后,servlet使用注解,所以不再使用web.xml文件。
Springmvc配置方式如下:
删除web.xml和spring-servlet.xml文件。
添加类:
参考程序
springMVC的RequestMapping的基本设置
参考程序:
103SpringMVC_servlet3.x_RequestMapping
1、在类的上面注解@RequestMapping("/ex.do")意思为所有的ex.do请求全部进入该类处理。
如上一章代码中编写@RequestMapping("/user.do").所有的user.do请求都会进入该Controller。
2、在自定义的controller中会调用有@RequestMapping注解字样的方法来处理请求。
@Controller
@RequestMapping("/user.do")
publicclassUserController{
@RequestMapping
publicStringaddUser(Modelmodel){
model.addAttribute("message","添加了一个用户");
System.out.println("UserController.addUser()");
return"/WEB-INF/jsp/addsuc.jsp";
}
}
3、当然可以编写多个处理请求的方法,而这些方法的调用都是通过@RequestMapping的属性类控制调用的。
@RequestMapping属性:
value:
指定请求的实际地址,指定的地址可以是URITemplate模式(最终请求的url为类的注解的url+方法注解的url)
value的uri值为以下三类:
A)可以指定为普通的具体值;
如:
@Controller
@RequestMapping("/user")
publicclassUserController{
@RequestMapping(value="/some.do")
publicModelAndViewhandleRequest(HttpServletRequestarg0,
HttpServletResponsearg1)throwsException{
System.out.println("handleRequest");
returnnewModelAndView("/WEB-INF/jsp/addsuc.jsp");
}
}
该注解的是说:
请求的url为”user/some.do”就会进入该方法(handleRequest)处理。
url:
user/some.do
B)可以指定为含有某变量的一类值(URITemplatePatternswithPathVariables);
如:
@RequestMapping(value="/{userId}/delete.do",method=RequestMethod.GET)
publicStringdelete(@PathVariableStringuserId){
System.out.println("delete:
"+userId);
return"/WEB-INF/jsp/addsuc.jsp";
}
这个注解:
url中带了参数的数据userIdurl:
user/1123/delete.do
使用@PathVariable指定形参接收url中的数据
C)可以指定为含正则表达式的一类值(URITemplatePatternswithRegularExpressions);
如:
@RequestMapping(value="/{userBirth:
\\d{4}-\\d{2}-\\d{2}}/update.do")
publicStringupdate(@PathVariableStringuserBirth){
System.out.println("userBirth:
"+userBirth);
return"/WEB-INF/jsp/addsuc.jsp";
}
请求的url类似:
user/1990-11-11/update.do
使用@PathVariable指定形参接收url中的数据
method:
指定请求的method类型,GET、POST、PUT、DELETE等;(也就是说只有制定类型的请求才会进入该方法处理)
consumes:
指定处理请求的提交内容类型(Content-Type),例如application/json,text/html;
produces:
指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params:
指定request中必须包含某些参数值是,才让该方法处理。
headers:
指定request中必须包含某些指定的header值,才能让该方法处理请求。
4、当类没有@RequestMapping注解时,则直接参考方法的注解匹配对于的url。
如:
@Controller
publicclassUserController{
@Controller
@RequestMapping("/user.do")
publicvoidmanagerUser(){}
}
在这里url为user.do则直接使用managerUser处理请求。
在controller中获取前台传递的参数
参考程序:
104SpringMVC_servlet3.x_reviceRequestParam
将页面数据传递到controller
页面表单:
用户名:
年龄:
生日:
Controller为:
/**
*1、直接使用形参获取前台传递的参数数据
*要注意的是形参的名字必须和页面参数的名字一致
*@parammodel
*@paramname
*@paramage
*@parambirth
*@return
*/
@RequestMapping(method=RequestMethod.POST)
publicStringaddUser(Modelmodel,Stringname,Integerage,Datebirth){
model.addAttribute("message","添加了一个用户");
System.out.println("name:
"+name+"\tage:
"+age+"\tbirht:
"+birth);
System.out.println("UserController.addUser()");
return"/WEB-INF/jsp/addsuc.jsp";
}
/**
*2、使用对象接受前台传递的参数,
*要注意的是前台传递的参数的名称必须和对象的属性名称一直,如果不一致则可以使用@ModelAttribute("u")Stringuname指定
*/
@RequestMapping(method=RequestMethod.POST)
publicStringaddUser(Modelmodel,Useruser){
model.addAttribute("message","添加了一个用户");
System.out.println("name:
"+user.getName()+"\tage:
"+user.getAge()+"\tbirht:
"+user.getBirth());
System.out.println("UserController.addUser()");
return"/WEB-INF/jsp/addsuc.jsp";
}
在controller中获取web元素
参考程序:
105SpringMVC_servlet3.x_accessWebElement
当某个方法需要使用web对象时(request,response,session,application)
可以使用如下方式:
除过application其他的对象都可以直接设为方法的形参即可。
spring会自动将对应的对象传递给对应的形参。
而application对象可以使用session对象获取。
当然也可以在方法中使用response对象重定向到其他的url这时方法最后return的url则可以视作无效。
同样的也可以使用request对象转发到其他的url。
程序示例:
@RequestMapping(value="/web.do")
publicStringgetWebElement(HttpServletRequestrequest,HttpServletResponseresponse,HttpSessionsession)throwsIOException,ServletException{
System.out.println("使用request获取的前台参数:
"+request.getParameter("pname"));
request.setAttribute("message","这个是request中的数据");
session.setAttribute("message","这个是session中的数据");
session.getServletContext().setAttribute("message","这个是application中的数据");
//response.sendRedirect("");
//returnnull;
//request.getRequestDispatcher("/WEB-INF/jsp/showData.jsp").forward(request,response);
return"/WEB-INF/jsp/showData.jsp";
}
将controller中数据传递到jsp页面
参考程序:
106SpringMVC_servlet3.x_modelAndView
1、可以在controller中获取request对象,然后将数据设置为request对象的属性,然后使用转发的方式进入jsp即可。
这一点不赘述。
2、将方法的返回值该为ModelAndView在返回时,将数据存储在ModelAndView对象中如:
newModelAndView("/WEB-INF/jsp/showData.jsp","message",message)
其中第一个参数为url,第二个参数为要传递的数据的key,第三个参数为数据对象。
在这里要注意的是数据是默认被存放在request中的。
程序示例:
//使用modelAndView对象将数据传递到前台。
@RequestMapping(value="/mad/showData_1.do")
publicModelAndViewshowData_1(){
Stringmessage="这个是要传递的数据";
//其中第一个参数为url,第二个参数为要传递的数据的key,第三个参数为数据对象。
//在这里要