Spring入门笔记--Spring MVC

Spring MVC

开发步骤

开发步骤:

  1. maven导入SpringMVC
  2. 配置SpringMVC核心控制器DispathcerServlet
  3. 创建Controller类和视图页面
  4. 使用注解配置Controller类中业务方法的映射地址
  5. 配置SpringMVC核心文件spring-mvc.xml
  6. 客户端发起请求测试

Spring MVC执行流程

配置文件

web.xml

  <servlet>
    <servlet-name>DispatchServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!--contextConfigLocation用来标识要载入的Spring配置文件-->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

其中,contextConfigLocation之前有说明:Spring入门笔记--Spring集成web环境

拦截器

执行流程:https://blog.csdn.net/qq_16050561/article/details/104427508
拦截器、过滤器、监听器:https://zhuanlan.zhihu.com/p/442012465

  1. 监听器:web容器的,监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件。比如说ServletContextListener监听web应用的启动,创建上下文对象ApplicationContext,并存储在最大的域servletContext中。
  2. 过滤器:web容器的,web.xml中配置,比如说过滤非法url
  3. 拦截器:spring-mvc的

拦截器样例

public class MyInterceptor1 implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("prehandler done");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("posthandler done");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

spring-mvc.xml

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.yihao.mvc.interceptor.MyInterceptor1"/>
        </mvc:interceptor>
    </mvc:interceptors>

Spring MVC的注解

注解 作用
@Controller 标识控制器
@RequestMapping 路径,请求方法和参数
@RequestParam 进行数据绑定
@PathVariable 通过请求路径获取值

spring-mvc.xml

  <!--Controller的组件扫描-->
  <context:component-scan base-package="com.yihao.mvc">
      <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  </context:component-scan>
  <!--配置内部资源视图解析器-->
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/jsp/"/>
      <property name="suffix" value=".jsp"/>
  </bean>
@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/quick",method = RequestMethod.GET)
    public String save() {
        return "success";
    }   //返回值会作为视图路径/success

    @RequestMapping(value = "/quick9",method = RequestMethod.GET)
    public void save9(@RequestParam(name = "name1") String name) {
        System.out.println(name);               //@RequestParam指定name接收请求中的name1
    }

    @RequestMapping(value = "/quick{num}",method = RequestMethod.GET)
    public void save10(@PathVariable int num) {
        System.out.println(num);               //@PathVariable可以接收路径中的值
    }
}
//如果请求为/user/quick9?name1=yihao 那么方法9和10都会执行

说明:组件扫描只扫描注解为Controller的;内部资源视图解析器默认拼接前缀/jsp/和后缀.jsp

数据响应

字符串形式

如上面所示,返回字符串会拼接前缀和后缀

ModelAndView

  @RequestMapping("/quick2")
  public String save2(ModelAndView mv) {  //Spring会自动注入一个形参供使用
      mv.setViewName("success");
      return "success";
  }

response回写

response.getWriter().print("hello itcast");

responseBody回写

@ResponseBody注解就行,return字符串不会作为视图

返回对象或集合

返回对象或集合,使用指定的转换器转换成为字符串,@ResponseBody注解仍然保留。
spring-mvc.xml

    <!--配置handler映射器,将返回对象转换成json-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>
 <!--简写,等效上面,推荐这种方式-->
    <mvc:annotation-driven/>
    @RequestMapping(value = "/quick8")
    @ResponseBody
    public User save8() {  //方法返回对象,最终前台打印字符串json {"name":"yihao","age":11}
        User user = new User();
        user.setAge(11);
        user.setName("yihao");
        return user;
    }

请求参数

支持的类型有:
1.基本数据类型 2.POJO类型 3.数组类型 3.集合类型

  1. 请求中携带的参数会自动映射到形参中,如果形参是对象,参数和对象属性名称匹配即可映射。
  2. 集合类型也可以映射:定义Vo,vo的属性private List<User> userList; 通过vo接收数据。
  3. 集合类型还有一种用法,请求时使用json封装,接收添加@RequestBody注解
  @RequestMapping(value = "/quick6")
  @ResponseBody
  public void save6(@RequestBody List<User> userList) {
      System.out.println(userList);
  }

请求js:

var userList = new Array();
userList.push({username:"yihao", age:27});
userList.push({username:"yiyan", age:23});
$.ajax({
    type: "post",
    url: "${pageContext.request.contextPath}/user/quick6",
    data:JSON.stringify(userList),
    contentType: "application/json;charset=utf-8"
});

静态资源访问

    <!--开放部分路径-->
    <mvc:resources mapping="/img/**" location="/img/"/>
    <!--默认使用容器处理,tomcat自动查找静态资源-->
    <mvc:default-servlet-handler/>

自定义转换器

    <!--配置处理适配器(上文已提到),注意,如果该配置存在,会使下面自定义转换器失效,推荐下面的方法-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>
 <!---------------------------------------------------------------------->
   <!--配置处理适配器,指定自定义转换器-->
    <mvc:annotation-driven conversion-service="owndefined"/>
   <!--指定转换器的id-->
    <bean id="owndefined" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <!--自定义的转换器实现-->
                <bean class="com.yihao.mvc.converter.DateConverter"/>
            </set>
        </property>
    </bean>
@Component
public class DateConverter implements Converter<String, Date> {
    public Date convert(String dateStr) {
        /*转换*/
        return new Date();
    }
}

对于转换器失效问题不理解,

Servlet参数

可以对作为控制器入参的ServletAPI进行注入:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession

获取请求头

@CookieValue
@RequestHeader

posted @ 2022-06-23 21:57  Saski&Naruto  阅读(47)  评论(0)    收藏  举报