现在的位置: 首页 > 综合 > 正文

springmvc-控制器&视图&视图解析器

2017年12月27日 ⁄ 综合 ⁄ 共 11051字 ⁄ 字号 评论关闭

一、SpringMVC控制器:

springmvc控制器-超强链接:http://blog.csdn.net/lufeng20/article/details/7598801

链接:

http://blog.csdn.net/jingyuan_/article/details/9465415

@RequestBody, @ResponseBody-链接:http://blog.csdn.net/walkerjong/article/details/7520896 

@ResponseBody,@RequestBody,@PathVariable-链接:http://snowolf.iteye.com/blog/1628861     

@RequestParam、@RequestBody、@PathVariable-链接:http://blog.csdn.net/walkerjong/article/details/7946109

 

---控制器Annotation:
开启springmvc的注解扫描:
         <context:component-scanbase-package="com.baobaotao.web"/>
 
---request Annotation:             
@RequestMapping
         ---各个注解
                   @PathVariable;
                   @RequestHeader,@CookieValue;
                   @RequestParam;
                   @SessionAttributes,@ModelAttribute;
         ---使用servlet api作为入参
                   HttpServletRequestrequest
                   HttpServletResponseresponse:如果处理方法自行使用response响应,则方法设置成void即可
                   HttpSessionsession
                   WebRequestrequest
         --同时允许io对象作为入参:ServletRequest拥有的getInputStream(),getReader()方法;
                   ServletResponse拥有getOutputStream(),getWriter()方法。
                  
---response Annotation:
[AnnotationMethodHandlerAdapter默认装配了4个HttpMessageConverter,将请求信息转换成对象,将对象转换成响应信息.
         --透明地使用httpMessageConverter<T>类型转换:
                   @RequestBody
                   @ResponseBody
                   HttpEntity<T>
                   ResponseEntity<T>

---例子:@RequestMapping

@RequestMapping(method = RequestMethod.POST)
public ModelAndView createUser(User user) {
	userService.createUser(user);
	ModelAndView mav = new ModelAndView();//ModelAndView
	mav.setViewName("user/createSuccess");
	mav.addObject("user", user);
	return mav;
}

@RequestMapping("/login.do")
public ModelAndView loginInit() {
	return new ModelAndView("/loginDemo");//ModelAndView
}

@RequestMapping("/tail/getStatusBar.do")
public ModelAndView getStatusBar(){
	Map model = new HashMap();
	model.put("userName", TitanSecurityManager.getLoginedUsername());
	return new ModelAndView("tail", model);//ModelAndView、Map
}

@RequestMapping(value = "/handle62")
public String handle62(@ModelAttribute("user") User user) {//@ModelAttribute
	user.setUserName("tom");
	return "/user/showUser";
}

@RequestMapping(value = "/handle63")
public String handle63(ModelMap modelMap) {
	User user = (User) modelMap.get("user");
	user.setUserName("tom");
	modelMap.addAttribute("testAttr", "value1");
	return "/user/showUser";
}	

@RequestMapping(value = "/handle71")
public String handle71(@ModelAttribute("user") User user) {
	user.setUserName("John");
	return "redirect:handle72.html";//redirect:,forward:跳转
}
// @SessionAttributes("user")
@RequestMapping(value = "/handle72")
public String handle72(ModelMap modelMap, SessionStatus sessionStatus) {
	User user = (User) modelMap.get("user");  //读取session中的模型数据
	if (user != null) {
		user.setUserName("Jetty");
		sessionStatus.setComplete();
	}
	return "/user/showUser";
}

@RequestMapping("/welcome") 
public void welcomeHandler() {} 
//如果返回值为空,则响应的视图页面对应为访问地址

//例子2:
	@RequestMapping(value = "/handle2")
	public ModelAndView handle2(@CookieValue("JSESSIONID") String sessionId,
			@RequestHeader("Accept-Language") String accpetLanguage) {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("success");
		mav.addObject("user", new User());
		return mav;
	}
	
	@RequestMapping(value = "/handle11")
	public String handle11(
			@RequestParam(value = "userName", required = false) String userName,
			@RequestParam("age") int age) {
		return "success";
	}

	@RequestMapping(value = "/handle13")
	public String handle13(@RequestHeader("Accept-Encoding") String encoding,
			@RequestHeader("Keep-Alive") long keepAlive) {
		return "success";
	}


	@RequestMapping(value = "/handle23")
	public String handle23(HttpSession session) {
		session.setAttribute("sessionId", 1234);
		return "success";
	}
	
	@RequestMapping(value = "/handle31")
	public void handle31(OutputStream os) throws IOException {
		Resource res = new ClassPathResource("/image.jpg");
		FileCopyUtils.copy(res.getInputStream(), os);
	}

	@RequestMapping(value = "/handle41")
	public String handle41(@RequestBody String body) {
		System.out.println(body);
		return "success";
	}

	@RequestMapping(value = "/handle51") //HttpMessageConverter
	public ResponseEntity<User> handle51(HttpEntity<User> requestEntity) {
		User user = requestEntity.getBody();
		user.setUserId("1000");
		return new ResponseEntity<User>(user, HttpStatus.OK);
	}

---例子:servlet api

@RequestMapping(value = "/handle21")
public void handle21(HttpServletRequest request, HttpServletResponse response) {
	String userName = request.getParameter("userName");
	response.addCookie(new Cookie("userName", userName));
}

@RequestMapping(value = "/handle22")
public ModelAndView handle22(HttpServletRequest request) {
	String userName = WebUtils.findParameterValue(request, "userName");
	ModelAndView mav = new ModelAndView();
	mav.setViewName("success");
	mav.addObject("userName", userName);
	return mav;
}

@RequestMapping(value = "/handle23")
public String handle23(HttpSession session) {
	session.setAttribute("sessionId", 1234);
	return "success";
}

@RequestMapping(value = "/handle25")
public String handle25(WebRequest request) {
	String userName = request.getParameter("userName");
	return "success";
}

---@ResponseBody说明:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。如果方法声明了注解@ResponseBody ,则会直接将返回值输出到页面。当返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

---@PathVariable说明:绑定值到方法的参数上

@Controller
@RequestMapping("/controller/{user}")
public class MyController {
  @RequestMapping("/test/{name}")
  public void test(@PathVariable String user, @PathVariable String name, Model model) {    
	//形如REST风格的地址访问:可以把请求url的参数中{user}和{name}的值绑定到方法的参数上。
	//如果url参数和方法参数名称不一样,还可通过@PathVariable("name")指定方法参数名字
	//...
  }
}

---@RequestParam:

//如果我们想改变这种默认的按名称匹配的策略,比如让listBoardTopic(int topicId,User user)中的topicId绑定到id这个URL参数,那么可以通过对入参使用@RequestParam注解来达到目的:
这里,对listBoardTopic()请求处理方法的topicId入参标注了@RequestParam("id")注解,所以它将和id的URL参数绑定。
@RequestMapping(params = "method=listBoardTopic")
public String listBoardTopic(@RequestParam("id") int topicId,User user) {
	bbtForumService.getBoardTopics(topicId);
	System.out.println("topicId:"+topicId);
	System.out.println("user:"+user);
	System.out.println("call listBoardTopic method.");
	return "listTopic";
}

---ModelMap传递参数:

@RequestMapping(params = "method=listBoardTopic")
public String listBoardTopic(@RequestParam("id")int topicId, User user,ModelMap model) {
	bbtForumService.getBoardTopics(topicId);
	System.out.println("topicId:" + topicId);
	System.out.println("user:" + user);	
	model.addAttribute("currUser",user); //将user对象以currUser为键放入到model中
	return "listTopic";
}
/*对于当次请求所对应的模型对象来说,其所有属性都将存放到 request 的属性列表中。象上面的例子,ModelMap 中的 currUser 属性将放到 request 的属性列表中,所以可以在 JSP 视图页面中通过 request.getAttribute(“currUser”) 或者通过 ${currUser} EL 表达式访问模型对象中的 user 对象。从这个角度上看, ModelMap 相当于是一个向 request 属性列表中添加对象的一条管道,借由 ModelMap 对象的支持,我们可以在一个不依赖 Servlet API 的 Controller 中向 request 中添加属性。在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap 中的属性将销毁。如果希望在多个请求中共享 ModelMap 中的属性,必须将其属性转存到 session 中,这样 ModelMap 的属性才可以被跨请求访问。*/

---@SessionAttributes

@Controller
@RequestMapping("/bbtForum.do")
@SessionAttributes("currUser") //①将ModelMap中属性名为currUser的属性
//放到Session属性列表中,以便这个属性可以跨请求访问
public class BbtForumController {

    @RequestMapping(params = "method=listBoardTopic")
    public String listBoardTopic(@RequestParam("id")int topicId, User user, ModelMap model) {
        bbtForumService.getBoardTopics(topicId);
        System.out.println("topicId:" + topicId);
        System.out.println("user:" + user);
        model.addAttribute("currUser",user); //②向ModelMap中添加一个属性
        return "listTopic";
    }
}
/*我们在②处添加了一个ModelMap属性,其属性名为currUser,而①处通过@SessionAttributes将ModelMap中名为currUser的属性放置到Session中,所以我们不但可以在 listBoardTopic() 请求所对应的 JSP 视图页面中通过 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 获取 user 对象,还可以在下一个请求所对应的 JSP 视图页面中通过 session.getAttribute(“currUser”) 或 ModelMap#get(“currUser”) 访问到这个属性。这里我们仅将一个 ModelMap 的属性放入 Session 中,其实 @SessionAttributes 允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,”attr2”})。此外,@SessionAttributes 还可以通过属性类型指定要 session 化的 ModelMap 属性,如 @SessionAttributes(types = User.class),当然也可以指定多个类,如@SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={"attr1","attr2"})。*/
@Controller
@RequestMapping("/bbtForum.do")
@SessionAttributes("currUser") //①让ModelMap的currUser属性拥有session级作用域
public class BbtForumController {
    @Autowired
	private BbtForumService bbtForumService;

    @RequestMapping(params = "method=listBoardTopic")
    public String listBoardTopic(@RequestParam("id")int topicId, User user, ModelMap model) {
        bbtForumService.getBoardTopics(topicId);
        System.out.println("topicId:" + topicId);
        System.out.println("user:" + user);
        model.addAttribute("currUser",user); //②向ModelMap中添加一个属性
        return "listTopic";
    }

    @RequestMapping(params = "method=listAllBoard")   
	public String listAllBoard(@ModelAttribute("currUser") User user) { //③将ModelMap中的currUser属性绑定到user入参中。
        bbtForumService.getAllBoard();
        System.out.println("user:"+user);
        return "listBoard";
    }
}
/*在 ② 处,我们向 ModelMap 中添加一个名为 currUser 的属性,而 ① 外的注解使这个 currUser 属性拥有了 session 级的作用域。所以,我们可以在 ③ 处通过 @ModelAttribute 注解将 ModelMap 中的 currUser 属性绑定以请求处理方法的 user 入参中。
所以当我们先调用以下 URL 请求: http://localhost/bbtForum.do?method=listBoardTopic&id=1&userName=tom&dept.deptId=12
以执行listBoardTopic()请求处理方法,然后再访问以下URL: http://localhost/sample/bbtForum.do?method=listAllBoard
你将可以看到 listAllBoard() 的 user 入参已经成功绑定到 listBoardTopic() 中注册的 session 级的 currUser 属性上了。*/

---请求处理方法的入参也可以一个对象:

//User.java
public class User {
    private int userId;
    private String userName;
    //get/setter...
    public String toString(){
        return this.userName +","+this.userId;
    }
}

@RequestMapping(params = "method=listBoardTopic")
public String listBoardTopic(int topicId,User user) {
	//将User对象作为test02()方法的一个入参
	//访问的url:http://localhost/test.do?method=test02&topicId=1&userId=10&userName=tom
	bbtForumService.getBoardTopics(topicId);
	System.out.println("topicId:"+topicId);
	System.out.println("user:"+user);
	System.out.println("call listBoardTopic method.");
	return "listTopic";
}

二、视图和视图解析器

springmvc对于请求处理方法执行完成后,最终会返回一个ModelAndView对象;而那些返回String、View或ModelMap等类型的方法,springmvc最终也会在内部将它们转成一个ModelAndView对象,包含视图逻辑名和模型对象的信息。

springmvc的不同类型的视图是解耦的,通过不同的视图解析器实现。

---ModelAndView:
	--添加模型数据:
	addObject()
	addAllObject()
	--设置视图:
	setView()
	setViewName()
	--其他:
	Map、Model、ModelMap
	@ModelAttribute:直接放入模型数据返回
	@SessionAttributes:暂存到HttpSession中共享数据

---例子:ModelAndView

@RequestMapping(value = "/demo",method = RequestMethod.GET)
public ModelAndView getBusinessIdListByIp(@RequestParam("ip") String ip,@RequestParam("phoneId") String phoneId,Model model){
	ModelAndView mav = new ModelAndView();
	model.addAttribute("ip", ip);
	model.addAttribute("phoneId", phoneId);
	mav.addObject(model);
	mav.setViewName("user/mav");
	return mav;
}

@RequestMapping(value = "/demo2",method = RequestMethod.GET)
public ModelAndView getBusinessIdListByIp(){
	return new ModelAndView("user/mav","key",new String("makeHappy"));
}

---spring mvc中的页面跳转(服务器跳转、请求重定向)

转发、重定向-链接:http://yjflfliulei.iteye.com/blog/1753756

方式1.在controller中实现redirect,可以使用sendRedirect()方法,然后返回
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response){
	........
	response.sendRedirect("photohouxuandetail.do?pid="+pid);
	return null;
}
方式2.还可以用redirect来实现,这样viewResolver认为是重定向操作,不再渲染该视图了,而是直接向客户端发出redirect响应
   return new ModelAndView("redirect:photohouxuandetail.do?pid="+pid);

    return "forward:/user/add"; //服务器跳转
    return "redirect:/index.jsp";//重定向

public String save(UmsUser user, RedirectAttributes redirectAttributes) {
	//...链接:http://elf8848.iteye.com/blog/875830(第14章)
	redirectAttributes.addFlashAttribute("message", "操作成功");//带参数的重定向(spring3.1)
	return "redirect:/user/showPage/";
}

---在页面之间传递信息:ModelMap

---视图解析器

如:InternalResourceViewResolver解析器专门解析jsp。JstlView解析JSTL标签。
<!-- 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
<!-- 如:login会被解析成 /WEB-INF/jsp/login.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
	p:viewClass="org.springframework.web.servlet.view.JstlView" 
	p:prefix="/WEB-INF/jsp/"
	p:suffix=".jsp" />

【上篇】
【下篇】

抱歉!评论已关闭.