SpringMVC

总结:

1、SpringMVC原理
2、拦截器:
	是Spring特有的,原理和过滤器一样,
	实现登陆功能,就是判断session中有没有用户数据,如果有则可以访问其他资源,如果没有则重定向到登陆页面

SpringMVC

回顾:MVC 模型(dao、service) 视图(jsp) 控制器(servlet)

controller:

  • 取得表单数据
  • 调用业务逻辑
  • 转向指定页面

Model:模型

  • 业务逻辑
  • 保存数据状态

view:视图

  • 显示页面

SpringMVC的优点:

  • 轻量级,简单易学
  • 高效,基于请求响应的mvc框架
  • 与spring兼容性好,无缝融合
  • 约定大于配置
  • 功能强大:RESTful数据校验格式化本地化主题
  • 简洁灵活

spring的web框架围绕DispatcherServlet【调度servlet】设计

1、SpringMVC原理图

在这里插入图片描述

  1. 用户请求到DispatcherServlet,会去找HandlerMapping去找对应的handler映射
  2. 找到对应的handler映射之后返回给DispatcherServlet
  3. DispatcherServlet通过handlerAdapter是去适配对应的handler,即controller
  4. handler(controller)将从service中获取到的数据及要请求的页面封装到ModelAndView,返回给DispatcherServlet
  5. DispatcherServlet通过视图解析器ViewResolver将ModelAndView中的数据渲染到请求的页面视图中

方式一:MVC实现原理

配置:DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
   <servlet>
       <servlet-name>springMVC</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <!--web容器启动就会加载spring的配置文件,生成所有的bean-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:spring-mvc.xml</param-value>
       </init-param>
       <!--启动级别,程序启动即加载-->
       <load-on-startup>1</load-on-startup>
   </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

spring配置文件:配置HandlerMapping、HandlerAdapter、以及视图解析器ViewResolver

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean id="/hello" class="com.kuang.controller.HelloController"/>
</beans>

编写handler代码

public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        System.out.println("***********");
        ModelAndView view = new ModelAndView();
        view.addObject("aa",new Date());
        view.setViewName("test");
        return view;

    }
}

方式二:注解配置MVC

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
   <servlet>
       <servlet-name>springMVC</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:spring-mvc.xml</param-value>
       </init-param>
       <!--启动级别,程序启动即加载-->
       <load-on-startup>1</load-on-startup>
   </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

spring配置

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.kuang"/>
    <!--过滤静态资源-->
    <mvc:default-servlet-handler/>
    <!--配置handlerMapping和handlerAdapter-->
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>
@Controller
public class HelloController {
	//如果返回值是String,并且有具体的页面可以跳转,则就会被视图解析器结息,跳转到对应的页面
    @RequestMapping("/hello")
    public String hello(Model model){
        model.addAttribute("aa",new Date());
        return "test";
    }
}

controller配置总结

  1. 实现Controller接口
  2. 注解@Controller (重点

RequestMapping

RestFul风格

传统风格:在这里插入图片描述

RestFul风格:在这里插入图片描述

@Controller
public class HelloController {
    @RequestMapping(value="/hello/{a}/{b}",method=RequestMethod.POST)
    @GetMapping
    @PostMapping
    public String hello(@PathVariable int a, @PathVariable int b, Model model) {
        int c = a + b;
        model.addAttribute("aa","结果为:"+c);
        return "test";
    }
}

@PathVariable注解必须加到参数上
即使相同的请求路径,如果请求方式不同,也会请求到不同的方法上
也可以直接使用

转发和重定向

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("aa","转发");
        //当配了视图解析器的情况下,这种用法会走视图解析,不适用
        return "/WEB-INF/jsp/test.jsp";
    }
    @RequestMapping("/hello1")
    public String hello1(Model model) {
        model.addAttribute("aa","转发1");
        //即使配了视图解析器,也可以实现转发
        return "forward:/WEB-INF/jsp/test.jsp";
    }
    @RequestMapping("/hello2")
    public String hello2(Model model) {
        
        model.addAttribute("aa","重定向");
        return "redirect:index.jsp";
    }
}

请求参数及数据回显

  1. 接收前端用户的参数,判断参数的名字,假设名字直接在方法上,可以直接使用
  2. 假设传递的是一个对象User,匹配User对象中的字段名,如果名字一致,则ok,否则匹配不到

在这里插入图片描述
回显三种方式:

  1. ModelAndView
  2. ModelMap
  3. Model

乱码问题

在web.xml中增加spring自带的过滤器

 <!--解决乱码问题-->
  <filter>
      <filter-name>encoding</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>
  </filter>
  <filter-mapping>
      <filter-name>encoding</filter-name>
       <!--/*可以过滤到.jsp页面,不加*的话,就不能过滤到请求.jsp页面-->
      <url-pattern>/*</url-pattern>
  </filter-mapping>

JSON

前后端分离时代:
后端独立部署,提供接口,提供数据
前端独立部署,负责渲染后端的数据

	<script>
        var user = {
            name: "wanghan",
            age: 5,
            sex: "男"
        }
        console.log(user)
        //将对象转化为json
        var json = JSON.stringify(user);
        console.log(json)
        //将json转化为对象
        var obj = JSON.parse(json)
        console.log(obj)
    </script>

controller返回Json数据

@ResponseBody 或者用@RestController,加上之后就不会走视图解析器

  1. Jackson
@Controller
public class UserController {
	//produces 解决json乱码问题
    @RequestMapping(value = "/json",produces = "application/json;charset=utf-8")
    @ResponseBody //@ResponseBody加上之后就不会走视图解析器
    public String test1() throws JsonProcessingException {
        //jackson包下有一个ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("王罕",15,"男");
        String str = mapper.writeValueAsString(user);
        return str;
    }
}

jackson解决乱码问题,在spring注解中的mvc:annotation-driven中配置即可

 <!--jackson解决乱码问题-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
  1. fastjson
    fastjson三个主要的类:
    JSONObejct代表json对象
    JSONArray代表json对象数组
    JSON代表JSONObejct和JSONArray的转化
		User user = new User("王罕",15,"男");
        String s = JSON.toJSONString(user);
        JSON json = (JSON)JSON.toJSON(user);
        User u = JSON.toJavaObject(json, User.class);

在这里插入图片描述

拦截器

拦截器是spring专有的,在spring的配置文件中配置

 	<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.kayak.config.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
public class MyInterceptor implements HandlerInterceptor {
    @Override
    //return true  放行  false 拦截
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("before");
        return true;
    }
    //请求返回后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("now");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("after");
    }
}

拦截器实现登陆模块

  1. 设置拦截器,对于session中没有用户登陆信息的请求,重定向到登陆页面
  2. 拦截器对于登陆页面和访问登陆接口的请求,都予以放行
  3. 访问登陆接口,验证完用户名密码,在session中set用户登陆信息
  4. session中有用户登陆信息,访问其他的页面,拦截器也不会拦截
  5. 如果session中没有用户登陆信息,则访问其他页面,则重定向到登陆页面
  6. 注销:将session用的用户登陆信息,则访问页面都会重定向到登陆界面
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        //如果要访问登陆页面,放行 goLogin
        if(request.getRequestURI().contains("goLogin")){
            return true;
        }
        //登陆提交之后访问的请求去后台验证用户名密码,也要放行 Login
        if(request.getRequestURI().contains("Login")){
            return true;
        }
        //其他的请求,如果session中有有登陆信息,也放行
        if(session.getAttribute("loginInfo")!=null){
            return true;
        }
        response.sendRedirect("goLogin.jsp");
        return false;
    }
}

文件的上传和下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值