springmvc02
spring核心类和注解
1.DispatcherServlet
DispatcherServlet的全名是org.springframework.web.servlet.DispatcherServlet,它在程序中充当着前端控制器的角色。在使用时,只需将其配置在项目的web.xml文件中,其配置代码如下:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置spring的配置文件 若为 servlet-name-servlet.xml 可以不写 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--设置为默认确醒的servlet,中不到匹配时,就匹配这一个-->
<url-pattern>/</url-pattern>
</servlet-mapping>
2.@Controller注解
org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,其注解形式为@Controller。该注解在使用时不需要再实现Controller接口,只需要将@Controller注解加入到控制器类上,然后通过Spring的扫描机制找到标注了该注解的控制器即可。
@Controller
public class FirstController {
@RequestMapping(value = "/first",method = RequestMethod.GET)
public ModelAndView first(){
// 数据 和 view 的封装
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","first");
modelAndView.setViewName("jsp/hello.jsp");
return modelAndView;
}
@RequestMapping("/first2")
public ModelAndView first2(){
// 数据 和 view 的封装
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","first2");
modelAndView.setViewName("jsp/hello.jsp");
return modelAndView;
}
}
注意扫描必须配置
<!--
使用注解开发springmvc web
-->
<!--开启包扫描器 让contrller生成 bean -->
<context:component-scan base-package="com.wgz.spring.controller"/>
<!--开启 url注解 绑定 handler 和 url -->
<mvc:annotation-driven />
<mvc:annotation-driven />主要做用
启用后,Spring会默认帮我们注册处理请求,参数和返回值的类。,其中最主要的两个类:DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter ,
3@RequestMapping
Spring通过@Controller注解找到相应的控制器类后,还需要知道控制器内部对每一个请求是如何处理的,这就需要使用@RequestMapping注解类型,它用于映射一个请求或一个方法。使用时,可以标注在一个方法或一个类上。
@Controller
@RequestMapping("/HiController")
public class HiController {
// value = {"/hi","/hi2"}, 与 path = {"/hi3","/hi4"} 等价,只能设置一个 method指定访问的类型
@RequestMapping(path = {"/hi3","/hi4"},name = "hiname",method = RequestMethod.GET)
public ModelAndView hi(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","hi");
modelAndView.setViewName("/jsp/hello.jsp");
System.out.println("controller");
return modelAndView;
}
}
- 标注在方法上:作为请求处理方法在程序接收到对应的URL请求时被调用
- 该类中的所有方法都将映射为相对于类级别的请求,表示该控制器所处理的所有请求都被映射到value属性值所指定的路径下。
4.组合注解
Spring框架的4.3版本中,引入了新的组合注解,来帮助简化常用的HTTP方法的映射,并更好的表达被注解方法的语义。
- @GetMapping:匹配GET方式的请求;
- @PostMapping:匹配POST方式的请求;
- @PutMapping:匹配PUT方式的请求;
- @DeleteMapping:匹配DELETE方式的请求;
- @PatchMapping:匹配PATCH方式的请求。
@Controller
@RequestMapping("/HiController")
public class HiController {
// value = {"/hi","/hi2"}, 与 path = {"/hi3","/hi4"} 等价,只能设置一个
//@RequestMapping(path = {"/hi3","/hi4"},method = RequestMethod.GET)
@GetMapping(path = {"/hi3","/hi4"}) // 两者等价
public ModelAndView hi(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","hi");
modelAndView.setViewName("/jsp/hello.jsp");
System.out.println("controller");
return modelAndView;
}
}
5.请求处理方法自带的参数和返回类型
在控制器类中,每一个请求处理方法都可以有多个不同类型的参数,以及一个多种类型的返回结果。在请求处理方法中,可以出现的参数类型如下:
javax.servlet.ServletRequest / javax.servlet.http.HttpServletRequest
javax.servlet.ServletResponse / javax.servlet.http.HttpServletResponse
javax.servlet.http.HttpSession
java.util.Map / org.springframework.ui.Model /org.springframework.ui.ModelMap
返回值类型
ModelAndView 可以添加Model数据,并指定视图
String 返回jsp视图地址 最为常用
void 在异步请求时使用,它只返回数据,而不会跳转视图
@GetMapping(value = "/play")
public String play(HttpServletRequest request, HttpServletResponse response,Model model){
model.addAttribute("msg","踢足球");
return "hello";
}
转发与重定向
/**
* 重定向 必须加 /
* @return
*/
@GetMapping("/redirectTest")
public String redirectTest(){
return "redirect:/HiController/play";
}
/**
* 转发
* @return
*/
@GetMapping("/forwardTest")
public String forwardTest(){
return "forward:/HiController/play";
}
6.ViewResolver视图解析器
视图解析器的目的就是帮助我们简化view的路径,为我们自动补全jsp的路径
Spring MVC中的视图解析器负责解析视图。可以通过在配置文件springmvc-servlet.xml中定义一个ViewResolver来配置视图解析器,其配置示例如下:
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"></property> <!--前缀-->
<property name="suffix" value=".jsp"></property> <!--后缀-->
</bean>