五、SpringMVC核心注解
5、1@Controller注解
在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口
5、2@RequestMapping注解
在Spring MVC 中最常被用到的注解之一。它通常被标注在控制器方法上,负责将请求与处理请求的控制器方法关联起来,建立映射关系。Spring MVC 的前端控制器(DispatcherServlet)拦截到用户发来的请求后,会通过 @RequestMapping 注解提供的映射信息找到对应的控制器方法,对这个请求进行处理。@RequestMapping注解可以被标注在方法上时,value 属性值就表示访问该方法的 URL 地址。当用户发送过来的请求想要访问该 Controller 下的控制器方法时,请求路径就必须与这个 value 值相同。@RequestMapping注解也可以标注在控制器类上时,value 属性的取值就是这个控制器类中的所有控制器方法 URL 地址的父路径。也就是说,访问这个 Controller 下的任意控制器方法都需要带上这个父路径。
六、SpringMVC请求参数
6、1使用形参形式进行参数传递
在 Controller 的控制器方法中设置与请求参数同名的形参,以获取请求中携带的参数。当浏览器发送的请求匹配到这个控制器方法时,Spring MVC 会自动将请求参数赋值给相应的方法形参。
@RequestMapping("/save")
public String save(HttpServletRequest request,String bookName,String bookAuthor,double bookPrice){
Book book=new Book(null,bookName,bookAuthor, BigDecimal.valueOf(bookPrice),null);
int result=bookService.saveBook(book);
System.out.println(result);
return "forward:/showBook";
}
6、2使用 @RequestParam 注解获取
在Controller的控制器方法中通过 @RequestParam 注解,在请求参数与控制器方法的形参之间建立起映射关系,将它们绑定起来。这样即使请求参数与控制器方法中的形参名称不一致,我们也能获取到对应的请求参数值。
@RequestMapping("/save")
public String save(HttpServletRequest request, @RequestParam("bookName") String bookName,@RequestParam("bookAuthor") String bookAuthor, @RequestParam("bookPrice") double bookPrice){
Book book=new Book(null,bookName,bookAuthor, BigDecimal.valueOf(bookPrice),null);
int result=bookService.saveBook(book);
System.out.println(result);
return "forward:/showBook";
}
6、3使用实体对象进行参数传递
在 Controller 的控制器方法的形参中设置一个实体类形参,如果请求参数的参数名与实体类中的属性名一致,那么 Spring MVC 会自动将请求参数封装到该实体类对象中。此时我们就可以通过该实体类对象获取所需的请求参数了。
@RequestMapping("/save")
public String save(HttpServletRequest request, Book book){
System.out.println(book);
int result=bookService.saveBook(book);
System.out.println(result);
return "forward:/showBook";
}
6、4解决获取请求参数的乱码问题
通过在we b.xml中加入编码格式过滤,实现对web请求和响应的编码格式处理,防止乱码
<!--请求和响应的字符串过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--设置请求的编码-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--设置响应的编码-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
七、SpringMVC响应视图
Spring MVC 的控制器方法支持 ModelAndView、ModelMap、View、String 多种类型的返回值,但无论控制器方法的返回值是哪种类型,Spring MVC 内部最终都会将它们封装成一个 ModelAndView 对象。ModelAndView 对象由 model(模型数据)和 view(视图)两部分组成,但这里的 view 通常并不是一个真正的 View 视图对象,而仅仅是一个 String 类型的逻辑视图名(View Name)而已,例如“success”、“index”等。这种情况下,Spring MVC 就需要借助 ViewResolver(视图解析器)将 ModelAndView 对象中逻辑视图名解析为真正的 View 视图对象,然后才能响应给客户端展示。Spring MVC 的核心理念是将 View 视图与 Model 模型进行解耦,其工作重心聚焦在 Model(模型)数据上。至于最终究竟采用何种视图技术对模型数据进行渲染,它并不关心,更不会强迫用户使用某种特定的视图实现技术。因此我们可以在 Spring MVC 项目中,根据自身需求自由地选择所需的视图技术,例如 Thymeleaf、JSP 等等。
7、1使用request共享数据
在控制器方法中设置一个 HttpServletRequest 类型的形参。通过它,我们就可以将模型数据共享
@RequestMapping("/showBook")
public String show(HttpServletRequest request){
List<Book> list=bookService.findBook();
request.setAttribute("list",list);
return "show";
}
7、2使用Model共享数据
在 Controller 控制器方法中设置一个 Model 类型的形参。通过它,我们也可以向 request 域对象中共享数据
@RequestMapping("/showBook")
public String show(Model model){
List<Book> list=bookService.findBook();
model.addAttribute("list",list);
return "show";
}
7、3使用ModelAndView共享数据(推荐)
通过 Spring 提供的 ModelAndView 向 reuqest 域对象中共享数据。ModelAndView 主要由 model(模型)和 view(视图)两部分组成。其中,model 负责数据共享,而 view 则主要用于设置视图,实现页面的跳转。
@RequestMapping("/showBook")
public ModelAndView show(HttpServletRequest request){
List<Book> list=bookService.findBook();
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("list",list);//通过model模型向request中共享数据
modelAndView.setViewName("show");//通过view模型进行视图跳转
return modelAndView;
}
7、4使用ModelMap共享数据
在 Controller 控制器方法中设置一个 ModelMap 类型的形参。通过它,我们也可以向 request 域对象中共享数据
@RequestMapping("/showBook")
public String show(ModelMap modelMap){
List<Book> list=bookService.findBook();
modelMap.addAttribute("list",list);
return "show";
}
7、5使用Map共享数据
在 Controller 控制器方法中设置一个 Map 类型的形参。通过它,我们也可以向 request 域对象中共享数据
@RequestMapping("/showBook")
public String show(Map<String,Object> map){
List<Book> list=bookService.findBook();
map.put("list",list);
return "show";
}
7、5使用session共享数据
在控制器方法中设置一个 HttpSession 类型的形参。通过它,我们就可以将数据共享到 session 域,也可以形参为request
@RequestMapping("/showBook")
public String show(HttpServletRequest request){
List<Book> list=bookService.findBook();
request.getSession().setAttribute("list",list);
return "show";
}
@RequestMapping("/showBook")
public String show(HttpSession session){
List<Book> list=bookService.findBook();
session.setAttribute("list",list);
return "show";
}
八、SpringMVC转发和重定向
Spring MVC 是对 Servlet 的进一步封装,其本质就是一个 Servlet,因此在 Spring MVC 中也存在转发和重定向的概念。在 Spring MVC 中,我们可以在逻辑视图名中通过“forward:”和“redirect:”两个关键字来表示转发和重定向。
8、1使用字符串实现转发和重定向
@RequestMapping("/showBook")
public String show(HttpServletRequest request){
List<Book> list=bookService.findBook();
request.getSession().setAttribute("list",list);
return "forward:/show";//转发跳转
}
@RequestMapping("/showBook")
public String show(HttpSession session){
List<Book> list=bookService.findBook();
session.setAttribute("list",list);
return "redirect:/show";//重定向跳转
}
8、2使用ModelAndView实现转发和重定向
@RequestMapping("/showBook")
public ModelAndView show(HttpServletRequest request){
List<Book> list=bookService.findBook();
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("list",list);//通过model模型向request中共享数据
modelAndView.setViewName("forward:/show");//通过view模型进行视图跳转,转发跳转
return modelAndView;
}
@RequestMapping("/showBook")
public ModelAndView show(HttpServletRequest request){
List<Book> list=bookService.findBook();
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("list",list);//通过model模型向request中共享数据
modelAndView.setViewName("redirect:/show");//通过view模型进行视图跳转,重定向跳转
return modelAndView;
}
此时试图解析器就不在根据配置进行前后缀追加,可以实现页面或servlet跳转