SpringMVC

SpringMVC

SSM:mybatis + Spring + SpringMVC MVC三层架构 MVC三层架构

JavaSE: 认真学习,老师带,入门快

JavaWeb:认真学习,老师带,入门快

SSM框架: 研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力

SpirngMVC + VUE + SPRINGBOOT + Springcloud + linux

SSM-=JAVAweb做项目

spring aop 和 ioc

SpringMVC : SpringMVC的执行流程!!

springMVC:SSM框架整合

spring

mvc:模型(dao,service) 视图层(jsp) 控制器(servlet)

dao

service

servlet:转发,重定向

jsp/html

前端 数据传输 实体类

实体类 :用户名 密码 生日 爱好 … . …20个

前端:用户名 密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8t77upF6-1642507318661)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220108234335080.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXNBpH5F-1642507318663)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220109200756940.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rdOlsOf-1642507318664)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220109200747587.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6HzHo7gi-1642507318664)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110050547453.png)]

mvc原理初理解

  1.     <!--1.注册DispatcherServlet-->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-servlet.xml</param-value>
            </init-param>
            <!--启动级别-->
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <!--/ 匹配所有的请求:(不包括.jsp)-->
        <!--/* 匹配所有的请求 : (包括.jsp)-->
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
  2. <?xml version="1.0" encoding="UTF-8"?>
    <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
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    
        <!--视图解析器:DispacherServlet给他的ModelAndview-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--Handler-->
        <bean id="/hello" class="com.yao.controller.HelloController"/>
    </beans>
    
  3. public class HelloController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            //ModelAndView  模型和视图
            ModelAndView mv = new ModelAndView();
    
            //封装对象,放在Modeandview中 ,model
            mv.addObject("msg","HelloMVC");
            //封装要跳转的视图,放在modelandview中
            mv.setViewName("hello");//WEB-INF/jsp/hello.jsp
            return mv;
        }
    }
    
    
  4. <body>
    ${msg}
    
    </body>
    
  5. SpringMVC 中处理器映射器 HandlerMapping 根据配置找到相应的 Handler,返回给前端控制器 DispatcherServlet,前端控制器再传给处理器适配器让它进行处理,处理器适配器会去找到对应的 Handler 去处理,处理后则就会返回一个 ModleAndView 对象。

模型:模型装数据

视图:视图负责转发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eGwJ4GVa-1642507318664)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110053423990.png)]

我觉得原理就是,web.xml下注册dispacherservlet,它会匹配所有路径都经过他,然后他会绑定一个配置文件,文件写了处理器适配器,然后把controller注册在这个配置中,id为他匹配的路径,然后处理器会查找这个路径并且执行,controller执行的结果会返回给配置中的视图解析器,视图解析器分析前缀后缀然后返回给dispacherservlet。

处理器映射器会把得到的id返回给dispacherservlet查看是否在他的路径中,如果在,就会返回给处理器适配器,然后去执行这个路径下的方法,然后return给视图解析器然后交给dispacher返回前端

springMVC注解实现开发

dispacher注册的配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vsRS9MkP-1642507318665)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110190750628.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IIDYZ0sc-1642507318665)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110185853041.png)]

  1. <!--1.注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <!--启动级别-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <!--/ 匹配所有的请求:(不包括.jsp)-->
    <!--/* 匹配所有的请求 : (包括.jsp)-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
  2. <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
            https://www.springframework.org/schema/mvc/spring-mvc.xsd
          ">
    <context:component-scan base-package="com.yao.controller"/>
        //静态资源过滤
    <mvc:default-servlet-handler/>
        <mvc:annotation-driven/>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
  3. @Controller//代表这个类会被Spring接管
    //被这个注解的类中的所有方法,如果返回值是String,并且有具体页面可以跳转,那么就会被视图解析器解析
    public class annoController {
    
        @RequestMapping("/h1")
        public String model(Model model){
            model.addAttribute("msg","hello,annocationspringmvc");//封装数据
            return "test";//会被视图解析器
        }
        @RequestMapping("/h2")
        public String mode22(Model model){
            model.addAttribute("msg","hello大苏打飒飒打撒gmvc");//封装数据
            return "test";//会被视图解析器
        }
        //可以实现视图的复用,jsp页面的复用
    
    }
    

Controller配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nnpbAxCy-1642507318666)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110225708687.png)]

实现controller接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4mx5OY1q-1642507318666)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110230307908.png)]

注解实现controller

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A8tQZwCn-1642507318666)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110230200289.png)]

//实现controller接口,springmvc-serlvte中不用写注解实现,只需要把这个类注册到bean中
public class controller implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //返回一个模型的对象
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","hellocontroller");
        mv.setViewName("test");
        return mv;
    }
}
<context:component-scan base-package="com.yao.controllertest"/>
<!--使用这种方式可以不用写映射器的额注解,只需要写扫描包-->
<!--<mvc:default-servlet-handler/>
    <mvc:annotation-driven/>-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean id="/test" class="com.yao.controllertest.controller"/>

该方法通过实现controller接口实现

RequestMapping

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3MAwvt1-1642507318667)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110232817368.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IctX6TbO-1642507318667)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220110233241260.png)]

RestFull风格

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUTJCQay-1642507318668)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220111142613123.png)]

@Controller
public class RestFullController {
    //原来的 : http://localhost:8080/add?a=1&b=2
    //RestFull : http://localhost:8080/add/a/b

    //指定以某种请求提交
    //http://localhost:8080/add/1/3
    @RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
    public String test(@PathVariable int a, @PathVariable int b, Model model){
    int res = a+b;
    model.addAttribute("msg","数值为"+res);
    return "test";
    }
    //post方式提交
    @PostMapping("/add/{a}/{b}")
    public String test1(@PathVariable int a, @PathVariable int b, Model model){
        int res = a+b;
        model.addAttribute("msg","结果1"+res);
        return "test";
    }

    //get方式提交
   /* @GetMapping("/add/{a}/{b}")
    public String test2(@PathVariable int a, @PathVariable int b, Model model){
        int res = a+b;
        model.addAttribute("msg","结果2"+res);
        return "test";
    }*/

ModelandView

在视图的跳转中,我们通常使用视图解析器设置前缀后缀,然后在实体类中设施model对象,return返回。

我们也可以像以前一样,使用req,resp的方式 ,使用重定向或者转发的方式

没有视图解析得情况下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6MGzWUq1-1642507318668)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220111195641087.png)]

重定向地址栏发生变化,请求转发不会。

有视图解析器的情况下,默认是转发,需要加redirect会重定向。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F0jEfJzs-1642507318668)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220111200107731.png)]

SpirngMVC:数据处理

获取前端的参数三种方式

1.ModelAndView

//实现controller接口,springmvc-serlvte中不用写注解实现,只需要把这个类注册到bean中
public class controller implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //返回一个模型的对象
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","hellocontroller");
        mv.setViewName("test");
        return mv;
    }

一般使用实现controller的方式使用

2.model

@RequestMapping("/t1")
//如果定义的对象为前段传来的参数,最好加个注解 @RequestParam("")
public String test1(@RequestParam("username") String name, Model model){
    //1.接收前端的参数
    System.out.println("接收到的前端参数为:"+name);

    //2.将返回的数据结果返回给前端
    model.addAttribute("msg",name);

    return "test";
}

一般使用注解@controller使用

在浏览器上方拼接即可

3.modelmap

一般使用注解@controller使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B3e1MGy7-1642507318669)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220112014103640.png)]

LinkedHashMap

ModelMap : 继承了LinkedHashMap,所以他拥有LinkedHashMap的所有功能!

Model : 精简版(大部分情况,我们都是用model)


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWNPCxNP-1642507318669)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220112013133571.png)]

@Controller
@RequestMapping("/user")
public class Usercontroller {

    //http://localhost:8080/user/t1?name=dasdsa
    @RequestMapping("/t1")
    //如果定义的对象为前段传来的参数,最好加个注解 @RequestParam("")
    public String test1(@RequestParam("username") String name, Model model){
        //1.接收前端的参数
        System.out.println("接收到的前端参数为:"+name);

        //2.将返回的数据结果返回给前端
        model.addAttribute("msg",name);

        return "test";
    }

    //http://localhost:8080/user/t2?id=1&name=dsadas&age=18

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

    * */

    @GetMapping("/t2")
    public String test2(User user){
        System.out.println(user);
        return "test";
    }
    
    //这是三种提交到前段的方式
    @GetMapping("/t3")
    public String test3(ModelMap modelMap){

        modelMap.addAttribute("msg","实闲了");

    return "test";
    }


}

SpirngMVC的乱码问题

官方的过滤器,我们可以直接使用

<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>forceEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

测试

<form action="/t1" method="post">
    <input type="text" name="name">
    <input type="submit">
</form>
@Controller
public class EncodingController {

    //req,resp,显然不能解决乱码,所以我们需要用到过滤器Filter
    //springmvc官方已经给了一个过滤器让我们使用解决乱码
    @PostMapping("/t1")
    public String Endcoding(String name,Model model){
        model.addAttribute("msg",name);
        return "test";
    }
}

3.如果是get请求,我们可以自己手动写一个过滤器来实现乱码问题的解决,当然也可以用官方提供的

SpirngMVC:JSON

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QM9uIOqq-1642507318669)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220112021037462.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRwA2QsY-1642507318670)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220112021755445.png)]

@Controller
public class UserController {

    @ResponseBody //它就不会走视图解析器,会直接返回一个字符串
    @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
    public String json1() throws JsonProcessingException {


        //jackson , ObjectMapper
        ObjectMapper mapper = new ObjectMapper();


    //创建一个对象
        User user = new User("樱桃",3,"男");

        String str =mapper.writeValueAsString(user);
        return str;

    }

}

如果出现乱码

​ @RequestMapping(value = “/j1”,produces = “application/json;charset=utf-8”)

可解决

JSON乱码问题配置:

<!--springmvc 统一解决json中文乱码问题-->
<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
        <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>

@ResponseBody

加了该注解它就不会走视图解析器,会直接返回一个字符串。

@RestController

效果也是一样,不会走视图解析器,返回的是字符串

三种方式获取json对象

 @RestController
public class UserController {

    @ResponseBody //它就不会走视图解析器,会直接返回一个字符串
    @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
    public String json1() throws JsonProcessingException {
        //jackson , ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
    //创建一个对象
        User user = new User("樱桃",3,"男");
        String str =mapper.writeValueAsString(user);
        return str;

    }
    @RequestMapping(value = "/j2",produces = "application/json;charset=utf-8")
    public String json() throws JsonProcessingException {
        //jackson , ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        List<User> userList = new ArrayList<>();
        User user = new User("樱桃",3,"男");
        User user1 = new User("樱桃1",4,"男");
        User user2= new User("樱桃2",6,"男");
        User user3 = new User("樱桃3",5,"男");
        userList.add(user);
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        System.out.println(userList);
        String str =mapper.writeValueAsString(userList);
        return str;

    }
    @RequestMapping(value = "/j3",produces = "application/json;charset=utf-8")
    public String json2() throws JsonProcessingException {
        //jackson , ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        //使用oBJECTmapper  来格式化
        mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);

        //这种方式是在date方法上进行定义还有一种使用在mapper上定义
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mapper.setDateFormat(sdf);
        //sdf.format(date)
        //创建一个对象
        Date date = new Date();
        
        return   mapper.writeValueAsString(date);
    }

创建一个工具类

package com.yao.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.text.SimpleDateFormat;

public class jsonUtils {
    public static String getJson(Object o) throws JsonProcessingException {
        return getJson(o,"yyyy-MM-dd HH:mm:ss");
    }

    public static String getJson(Object o,String dateFormat) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);
        //这种方式是在date方法上进行定义还有一种使用在mapper上定义
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        mapper.setDateFormat(sdf);

        return mapper.writeValueAsString(o);

    }

}







@RequestMapping(value = "/j2",produces = "application/json;charset=utf-8")
    public String json() throws JsonProcessingException {

        //创建一个对象
        List<User> userList = new ArrayList<>();
        User user = new User("樱桃",3,"男");
        User user1 = new User("樱桃1",4,"男");
        User user2= new User("樱桃2",6,"男");
        User user3 = new User("樱桃3",5,"男");
        userList.add(user);
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);


        return jsonUtils.getJson(userList);

    }
    @RequestMapping(value = "/j3",produces = "application/json;charset=utf-8")
    public String json2() throws JsonProcessingException {
        Date date = new Date();

        return  jsonUtils.getJson(date,"yyyy-MM-dd HH:mm:ss");

    }


之后的方法变得特别简单,上诉方法也实现了代码的复用,我们有养成这样的思想。

阿里巴巴 fastjson

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IRVjaIUA-1642507318670)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220113205638440.png)]

ajax

ajax是一种在无需重新加载整个页面的情况下,能够更新部分网页的技术

JQuery是一个库:js的大量函数(方法)

HTML + CSS 略懂 + js (超级熟练)

js:

  • 函数 闭包()()自己掉自己
  • Dom
    • id,name,tag
    • create,remove
  • Bom
    • windos
    • document

Es6:impoort require

拦截器

拦截器只拦截controller请求,不拦截静态资源。

我们所有WEB-INF下的资源,都需要通过controller层去调用,不能直接去访问。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CawWq3Hb-1642507318670)(C:\Users\宁智波带土\AppData\Roaming\Typora\typora-user-images\image-20220117013450843.png)]

    <!--拦截器配置-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--包括这个请求下面的所有的请求-->
        <mvc:mapping path="/**"/>
        <bean class="com.yao.controller.Myinterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>
package com.yao.controller;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Myinterceptor implements HandlerInterceptor {
    //return true;执行下一个拦截器,放行
    //return false;不执行下一个拦截器
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("=========处理前========");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("=========处理后========");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("=========结束清理========");
    }
}



=========处理前========
interceptor方法执行了
=========处理后========
=========结束清理========

登录验证案例:

首先写三个jsp页面:

<body>

<h1><a href="${pageContext.request.contextPath}/user/goLogin">登陆页面</a></h1>
<h1><a href="${pageContext.request.contextPath}/user/main">首页</a></h1>
</body>
首页
<span>${username}</span>
<p>
    <a href="${pageContext.request.contextPath}/user/goOut">注销</a>
</p>
<form action="${pageContext.request.contextPath}/user/login" method="post">
<p>
    账号:<input type="text" name="username">
</p>

    <p>
        密码:<input type="text" name="password">
    </p>
    <input type="submit" value="提交">


</form>

Controller层

package com.yao.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/user")
public class LoginController {
    @RequestMapping("/main")
    public String main(){
        return "main";
    }


    @RequestMapping("/goLogin")
    public String login(){
        return "login";
    }

    //输入账号密码  提交用的
    @RequestMapping("/login")
    public String login(HttpSession session, String username, String password, Model model){
        //把用户信息存在session中
        session.setAttribute("userLoginInfo",username);
        model.addAttribute("username",username);
        return "main";
    }
    //注销操作
    @RequestMapping("/goOut")
    public String goOut(HttpSession session){
        //把用户信息存在session中
        //session.invalidate();         销毁session
        session.removeAttribute("userLoginInfo");  //移除session
        return "main";
    }
}

拦截器

public class Logininterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("======处理了=======");
        HttpSession session = request.getSession();
        //放行 : 判断什么情况下放行

        //登陆页面也得放行,,含有login的路径
        if(request.getRequestURI().contains("goLogin")){
            return true;
        }

        //第一次登陆的原因,没有session,所以点击登录也会被拦截
        if(request.getRequestURI().contains("login")){
            return true;
        }
        //第一次登陆的原因,没有session,所以点击登录也会被拦截
        if(session.getAttribute("userLoginInfo")!=null){
            return true;
        }


        //判断什么情况下没有登陆
        request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
        return false;
    }

}

配置

    <!--拦截器配置-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--包括这个请求下面的所有的请求-->
        <!-- /book/a1   /book/a2  这种类似  -->
        <mvc:mapping path="/user/**"/>
        <bean class="com.yao.config.Logininterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

总体思想就是只有登录相关的页面,我们才会放行,其他无关的一律不放行,在登录得到session的时候,所有请求都会放行。
//登陆页面也得放行,含有login的路径
if(request.getRequestURI().contains(“goLogin”)){
return true;
}

    //第一次登陆的原因,没有session,所以点击登录也会被拦截
    if(request.getRequestURI().contains("login")){
        return true;
    }
    //第一次登陆的原因,没有session,所以点击登录也会被拦截
    if(session.getAttribute("userLoginInfo")!=null){
        return true;
    }


    //判断什么情况下没有登陆
    request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
    return false;
}

}


配置

```xml
    <!--拦截器配置-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--包括这个请求下面的所有的请求-->
        <!-- /book/a1   /book/a2  这种类似  -->
        <mvc:mapping path="/user/**"/>
        <bean class="com.yao.config.Logininterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

总体思想就是只有登录相关的页面,我们才会放行,其他无关的一律不放行,在登录得到session的时候,所有请求都会放行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值