栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC入门笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC入门笔记

SpringMVC 1.什么是SpringMVC

它是基于MVC开发模式的框架,用来优化控制器.它是Spring家族的一员.它也具备IOC和AOP.

2.什么是MVC?

它是一种开发模式,它是模型视图控制器的简称.所有的web应用都是基于MVC开发.
M:模型层,包含实体类,业务逻辑层,数据访问层
V:视图层,html,javaScript,vue等都是视图层,用来显现数据
C:控制器,它是用来接收客户端的请求,并返回响应到客户端的组件,Servlet就是组件

3.ssm框架优化的方向

4.SpringMVC框架的优点

1)轻量级,基于MVC的框架
2)易于上手,容易理解,功能强大
3)它具备IOC和AOP
4)完全基于注解开发

请求流程

SpringMVC的执行流程

5.基于注解的SpringMVC框架开发的步骤

1)新建项目,选择webapp模板.
2)修改目录,添加缺失的test,java,resources(两套),并修改目录属性
3)修改pom.xml文件,添加SpringMVC的依赖,添加Servlet的依赖

    

      org.springframework
      spring-webmvc
      5.2.5.RELEASE
    
    
    
      javax.servlet
      javax.servlet-api
      3.1.0
    

4)添加springmvc.xml配置文件,指定包扫描,添加视图解析器.

    
    
    
    
        
        
        
        
    

5)删除web.xml文件,新建web.xml
6)在web.xml文件中注册springMVC框架(所有的web请求都是基于servlet的)

    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:springmvc.xml
        
    
    
        springmvc
        
        *.action
    

7)在webapp目录下新建admin目录,在admin目录下新建main.jsp页面,删除index.jsp页面,并新建,发送请求给服务器

8)开发控制器(Servlet),它是一个普通的类.

	  @Controller  //交给Spring去创建对象
	public class DemoAction {
	    
	    @RequestMapping("/demo")
	    public String demo(){
	        System.out.println("服务器被访问到了.......");
	        return "main";  //可以直接跳到/admin/main.jsp页面上
	    }
	}

9)添加tomcat进行测试功能

6.分析web请求

web请求执行的流程
核心处理器
index.jsp<--------------->DispatcherServlet<------------------->SpringMVC的处理器是一个普通的方法
one.jsp <--------------->DispatcherServlet<------------------->SpringMVC的处理器是一个普通的方法

DispatcherServlet要在web.xml文件中注册才可用.

注解式开发 1.@RequestMapping注解详解

此注解就是来映射服务器访问的路径.
1)此注解可加在方法上,是为此方法注册一个可以访问的名称(路径)

  @RequestMapping("/demo")
    public String demo(){
        System.out.println("服务器被访问到了.......");
        return "main";  //可以直接跳到/admin/main.jsp页面上
    }
  访问服务器

2)此注解可以加在类上,相当于是包名(虚拟路径),区分不同类中相同的action的名称

  @RequestMapping("/user")
  public class DemoAction1 {..}
  访问服务器

3)此注解可区分get请求和post请求

  @Controller
	public class ReqAction {
	    @RequestMapping(value = "/req",method = RequestMethod.GET)
	    public String req(){
	        System.out.println("我是处理get请求的........");
	        return "main";
	    }
	    @RequestMapping(value = "/req" ,method = RequestMethod.POST)
	    public String req1(){
	        System.out.println("我是处理post请求的........");
	        return "main";
	    }
	}
2.五种数据提交方式的优化 1)单个提交数据

页面:

  
姓名:
年龄:
s

action:

  @RequestMapping("/one")
    public String one(String myname,int age){  ===>自动注入,并且类型转换
        System.out.println("myname="+myname+",age="+(age+100));
        return "main";
    }
2)对象封装提交数据
在提交请求中,保证请求参数的名称与实体类中成员变量的名称一致,则可以自动创建对象,则可以自动提交数据,自动类型转换,自动封装数据到对象中.
实体类:
    public class Users {
    private String name;
    private int age;
    }
页面:
	
姓名:
年龄:
action:
    @RequestMapping("/two")
    public String two(Users u){
        System.out.println(u);
        return "main";
    }
3)@PathVariable以及动态占位符提交

@PathVariable常常用在restful风格的请求中,是用来解析路径中参数名称不一致的问题
仅限于超链接或地址拦提交数据.它是一杠一值,一杠一大括号,使用注解@PathVariable来解析.

  动态提交   
   @RequestMapping("/three/{uname}/{uage}")
    public String three(
            @PathVariable("uname")  ===>用来解析路径中的请求参数
            String name,
            @PathVariable("uage")
            int age){
        System.out.println("name="+name+",age="+(age+100));
        return "main";
    }
4)映射名称不一致

@RequestParam是用来解决请求参数名称不一致的问题

  • 页面

4.参数名称不致解决方案

姓名:
年龄:
  • action

    提交请求参数与action方法的形参的名称不一致,使用注解@RequestParam来解析

    
    @RequestMapping("/four")
    public String four(
            @RequestParam("name")  ===>专门用来解决名称不一致的问题
            String uname,
            @RequestParam("age")
            int uage){
        System.out.println("uname="+uname+",uage="+(uage+100));
        return "main";
    }
5)手工提取数据
  • 页面

5.手工提取数据

姓名:
年龄:
  • action
  
  @RequestMapping("/five")
    public String five(HttpServletRequest request){
        String name = request.getParameter("name");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println("name="+name+",age="+(age+100));
        return "main";
    }   
3.中文乱码解决方案

配置过滤器.

  
        encode
        org.springframework.web.filter.CharacterEncodingFilter
        
        
            encoding
            UTF-8
        
        
            forceRequestEncoding
            true
        
        
            forceResponseEncoding
            true
        
    
    
        encode
        
@Controller
public class MyDateAction {

    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
    
//    @RequestMapping("/mydate")
//    public String mydate(
//            @DateTimeFormat(pattern = "yyyy-MM-dd")
//            Date mydate){
//        System.out.println(mydate);
//        System.out.println(sf.format(mydate));
//        return "show";
//    }

    //注册一个全局的日期处理注解
    @InitBinder
    public void initBinder(WebDataBinder dataBinder){
        dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(sf,true));
    }
    @RequestMapping("/mydate")
    public String mydate(Date mydate, HttpServletRequest request){
        System.out.println(mydate);
        System.out.println(sf.format(mydate));
        request.setAttribute("mydate",sf.format(mydate));
        return "show";
    }

    @RequestMapping("/list")
    public String list(HttpServletRequest request) throws ParseException {
        Student stu1 = new Student("张三",sf.parse("2000-01-01"));
        Student stu2 = new Student("李四",sf.parse("2001-08-11"));
        Student stu3 = new Student("王五",sf.parse("2002-09-21"));
        List list = new ArrayList<>();
        list.add(stu1);
        list.add(stu2);
        list.add(stu3);
        request.setAttribute("list",list);
        return "show";
    }
}
1)日期的提交处理 A.单个日期处理
要使用注解@DateTimeFormat,此注解必须搭配springmvc.xml文件中的
    @RequestMapping("/mydate")
    public String mydate(
            @DateTimeFormat(pattern = "yyyy-MM-dd")   //前端传过来的日期,转为日期格式注入
            Date mydate){
        System.out.println(mydate);
        System.out.println(sf.format(mydate));   //格式日期输出
        return "show";
    }
B.类中全局日期处理

全局的则不需要mvc:annotationdriven标签
注册一个注解,用来解析本类中所有的日期类型,自动转换. dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); } 2)日期的显示处理

在页面上显示好看的日期,必须使用JSTL.
步骤:
A)添加依赖jstl

      jstl
      jstl
      1.2

B)在页面上导入标签库
如果是单个日期对象,直接转为好看的格式化的字符串进行显示.
如果是list中的实体类对象的成员变量是日期类型,则必须使用jstl进行显示.
    <%--导入jstl核心标签库--%>
	<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
	<%--导入jstl格式化标签库--%>
	<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
C)使用标签显示数据
  
    
姓名 生日
${stu.name} ${stu.birthday}------
的作用参考

https://www.zhihu.com/question/362051844/answer/1286615054

9.资源在WEB-INF目录下

此目录下的动态资源,不可直接访问,只能通过请求转发的方式进行访问 .

  @Controller
	public class WebInfAction {
	    @RequestMapping("/showIndex")
	    public String showIndex(){
	        System.out.println("访问index.jsp");
	        return "index";
	    }
	    @RequestMapping("/showMain")
	    public String showMain(){
	        System.out.println("访问main.jsp");
	        return "main";
	    }
	    @RequestMapping("/showLogin")
	    public String showLogin(){
	        System.out.println("访问login.jsp");
	        return "login";
	    }
	    //登录的业务判断
	    @RequestMapping("/login")
	    public String login(String name, String pwd, HttpServletRequest request){
	        if("zar".equalsIgnoreCase(name) && "123".equalsIgnoreCase(pwd)){
	            return "main";
	        }else{
	            request.setAttribute("msg","用户名或密码不正确!");
	            return "login";
	        }
	    }
	}
拦截器 1.SpringMVC的拦截器

针对请求和响应进行的额外的处理.在请求和响应的过程中添加预处理,后处理和最终处理.

2.拦截器执行的时机

1)preHandle():在请求被处理之前进行操作,预处理
2)postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果,后处理
3)afterCompletion:所有的请求响应结束后执行善后工作,清理对象,关闭资源 ,最终处理.

3.拦截器实现的两种方式

1)继承HandlerInterceptorAdapter的父类
2)实现HandlerInterceptor接口,实现的接口,推荐使用实现接口的方式

4.拦截器应用场景

1、日志记录:记录请求信息的日志
2、权限检查,如登录检查
3、性能检测:检测方法的执行时间
4、处理cookie、本地化、国际化、主题等。
5、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)
6、登录验证,判断用户是否登录。

5.拦截器实现的步骤

注意:拦截器可以配置多个,形成拦截器链,即可以多次拦截
1)改造登录方法,在session中存储用户信息,用于进行权限验证

  @RequestMapping("/login")
    public String login(String name, String pwd, HttpServletRequest request){
        if("zar".equalsIgnoreCase(name) && "123".equalsIgnoreCase(pwd)){
            //在session中存储用户信息,用于进行权限验证
            request.getSession().setAttribute("users",name);
            return "main";
        }else{
            request.setAttribute("msg","用户名或密码不正确!");
            return "login";
        }
    }

2)开发拦截器的功能.实现HandlerInterceptor接口,重写preHandle()方法

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //是否登录过的判断
        if(request.getSession().getAttribute("users") == null){
            //此时就是没有登录,打回到登录页面,并给出提示
            request.setAttribute("msg","您还没有登录,请先去登录!");
            //最原始的请求转发
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
                .forward(request,response);
            
            return false;
        }
        return true;//放行请求
    }
}

2)在springmvc.xml文件中注册拦截器


  
    
    jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmuser?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123

5)添加SqlMapConfig.xml文件(使用模板)

 

  
  
  
  
    
  
  

6)添加applicationContext_mapper.xml文件(数据访问层的核心配置文件)



  
  
  
  
  
  
    
    
    
    
  
  
  
  
    
    
    
    
    
    
  
  
  
    
  

7)添加applicationContext_service.xml文件(业务逻辑层的核心配置文件)



  
  
  
  
  
  
  
    
    
  
  
  
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
  
  
  
    
    
  


8)添加spirngmvc.xml文件



  
  
  
  
  
  

9)删除web.xml文件,新建,改名,设置中文编码,并注册spirngmvc框架,并注册Spring框架



  
  
    encode
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    
    
      forceRequestEncoding
      true
    
    
      forceResponseEncoding
      true
    
  
  
    encode
    /*
  
  
  
    springmvc
    org.springframework.web.servlet.DispatcherServlet
    
      contextConfigLocation
      classpath:springmvc.xml
    
  
  
    springmvc
    /
  
  
  
    org.springframework.web.context.ContextLoaderListener
  
  
    contextConfigLocation
    
    classpath:applicationContext_*.xml
  


10)新建实体类user
11)新建UserMapper.java接口
12)新建UserMapper.xml实现增删查所有功能,没有更新
13)新建service接口和实现类
14)新建测试类,完成所有功能的测试
15)新建控制器,完成所有功能
16)浏览器测试功能

依赖中的标签

provided 表示该依赖打包的时候不要打包进去
test 表示只在测试中用这个依赖
scope的几个属性详解:

  • compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。
  • test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit。
  • runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段。
  • provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作。
  • system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径。
分页小技巧

如何显示某一页的数据 (当前页码-1)*每页的条数
总共有多少页:总数据数 %每页条数 ,如果是整除,则总页数 就等于 总数据数 /每页条数;
如果不整除,则总页数等于 总数据数 /每页条数 +1

其次还需要注意的是:页码page的类型尽量用封装类型Integer,而不用int;因为int的默认值是0,而0有可能是我们传过来的页码;如果用Integer判空就可以用是否为null,而不用0来判空

@RequestMapping("/selectUserPage")
public List selectUserPage(String userName,String userSex,Integer page){
    //根据页码计算起始行
    int startRow = 0;
    if(page != null){
        startRow = (page-1) * PAGE_SIZE;
    }
    
    return userService.selectUserPage(userName,userSex,startRow);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/937614.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号