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

springmvc和springboot的区别(springmvc常用注解)

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

springmvc和springboot的区别(springmvc常用注解)

SpringMVC

一、MVC简介二、SpringMVC的简单使用

1.简介2.简单使用3.提高jsp页面安全性4.★★SpringMVC请求的处理过程★★ 三、SpringMVC注解式开发

1.@RequestMapping2.@RequestParam 四、处理器方法接收的参数

★接收用户提交的数据★ 五、处理器方法的返回值

1.返回ModelAndView2.返回String3.返回void4.返回Object对象 六、Idea创建SpringMVC要注意的事情

1.post提交方式导致的中文乱码2.在web.xml文件创建DispatcherServlet时使用"/"进行过滤访问,导致静态资源无法正常访问3.运行项目时Tomcat启动失败4.访问资源之 相对/绝对 地址 七、SSM整合开发八、拦截器

1.基本使用2.多个拦截器的使用顺序3.拦截器与过滤器的区别


一、MVC简介

MVC:Model模型层 (dao、service)、View视图层 (jsp)、Controller控制层 (servlet),是一个软件设计规范 (架构),见JavaWeb-MVC:https://editor.csdn.net/md/?articleId=123122567

二、SpringMVC的简单使用 1.简介

是基于spring的一个框架,可以理解为servlet的升级

2.简单使用


(1) 可能用到的依赖

见: https://blog.csdn.net/weixin_42431775/article/details/123555841 

(2) 配置web.xml文件




    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:springmvc-servlet.xml
        
        
        1
    
    
        springmvc
        
        
        *.do
    

(3) 创建index.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    $Title$


    $END$
    

第一个springmvc项目

发起some.do请求

(4) 创建控制器 (处理器)类

@Controller(value = "myController")
//@RequestMapping("/test"),表示该类下的映射方法都在某个模块下 (此时的/some.do实际上为/test/some.do)
public class MyController {
    //自定义方法:处理用户提交的强求
    
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        //处理some.do请求 (相当于service调用处理结束了)
        ModelAndView modelAndView = new ModelAndView();
        //添加数据,框架在请求的最后把这些数据放入request作用域中 (相当于req.setAttribut("msg", "欢迎使用springmvc进行开发"))
        modelAndView.addObject("msg", "欢迎使用springmvc进行开发");
        modelAndView.addObject("fun", "执行的是dosome方法");

        //指定视图,相当于req.getRequestDispather("/show.jsp").forward(req, resp);
        modelAndView.setViewName("/show.jsp");

        return modelAndView;
    }
}

(5) 创建作为结果的jsp页面,显示请求的处理结果

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


    

这是show.jsp从request作用域中获取数据


msg数据是:${msg}

fun数据是:${fun}

(6) 创建springmvc的配置文件springmvc.xml




    
    
    

    
    

3.提高jsp页面安全性

将一些有安全隐患的页面放置在WEB-INF包下

优化 springmvc.xml

在springmvc.xml中新增


    
    
    
    

优化MyController类
显式转发:forward:/视图全路径 (不受视图解析器的限制,转发是【一次http请求】)
显式重定向:redirect:/视图全路径 (不受视图解析器的限制,重定向是【两次http请求】故【不能使用请求作用域,除非使用框架来获取 (在后端设置值,在前端页面使用${param.xx}获取)】且【访问的地址会发生变化】,重定向不能访问【WEB-INF的资源】)

public class MyController {
	//value 可以设置多个别名,用 {} 括起来即可
    @RequestMapping(value = {"/some.do","/first.do"})
    public ModelAndView doSome(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg", "欢迎使用springmvc进行开发");
        modelAndView.addObject("fun", "执行的是doSome方法");

        //指定视图之优化:设置了视图解析器后,可以用文件名来指定视图
        modelAndView.setViewName("show");
        //当想访问的页面不在view包下时 (在WEB-INF的other包下),可使用显式转发 (不受视图解析器的限制)
        //modelAndView.setViewName("forward:/WEB-INF/other/show.jsp");
        return modelAndView;
    }
    
    @RequestMapping(value = {"/other.do","/second.do"})
    public ModelAndView doOther(){
        ModelAndView modelAndView = new ModelAndView();
        //设置值,方便重定向后取值
        modelAndView.addObject("msg", "===欢迎使用springmvc进行开发===");
        modelAndView.addObject("fun", "执行的是doOther方法");

        //modelAndView.setViewName("other");
        //显式重定向,访问不到WEB-INF下的资源
        modelAndView.setViewName("redierect:/other/other.jsp");
        return modelAndView;
    }
}

//显示重定向后获取值

这是show.jsp从request作用域中获取数据


msg数据是:${param.msg}

fun数据是:${param.fun}

4.★★SpringMVC请求的处理过程★★

DispatcherServlet中央控制处理器:实质上是一个HttpServlet,所有的请求都有经过它来统一分发


三、SpringMVC注解式开发 1.@RequestMapping

@RequestMapping:请求映射,作用:把一个请求地址和一个方法进行绑定
@RequestMapping 放于不同位置时的作用

(1) 放在类的上边时,表示该类下的【映射方法】都在【某个模块】下 ,如
@Controller
@RequestMapping(/user)		//表示/some.do是在user模块下的方法
public class MyController {
    @RequestMapping(value = {"/some.do","/first.do"})
    public ModelAndView doSome(){}

(2) 放在方法上时,表示设置【处理器方法】,如
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){}

@RequestMapping 的 value 属性

value属性表示【为该方法设置个地址别名 (可设多个)】,前端页面可以指向该地址,如
@RequestMapping(value = {"/test/some.do","/test/first.do"})

发起some.do请求

@RequestMapping 的 method 属性

method属性可以【设置该处理器方法的请求方式:get/post】,如
@RequestMapping(value = "/other.do",method = RequestMethod.POST)
public ModelAndView doOther(){}

@RequestMapping 的 produces 属性

produces属性可以【指定服务器编码方式】
@RequestMapping(value = "/other.do",produces = "text/plain;charset=utf-8")
2.@RequestParam

在2的基础上使用@RequestParam,可以在使用【逐个接收】的方式中解决请求参数名称与处理器方法形参名不一致仅限于逐个接收方式使用
@RequestParam的 required 属性 (默认为true),要求内容必须不为空 (设置为false即可为空)

//处理器类
@Controller
public class MyController {
    //@RequestParam:解决请求参数名称与处理器方法形参名不一致
    @RequestMapping(value = "/receiveParam.do",method = RequestMethod.POST)
    public ModelAndView doOther(@RequestParam("rusername")String username, @RequestParam(value = "rage",required = false)Integer age){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("username", username);
        modelAndView.addObject("age", age);
        modelAndView.setViewName("other");

        return modelAndView;
    }
}

//other.jsp

other.jsp从request作用域中获取数据


用户名是:${username}

年龄是:${age}

//index.jsp

请求参数名称与处理器方法形参名不一致



四、处理器方法接收的参数

复制项目:打开项目所在地,复制一份,删掉target包,在Modules点+号引入即可

★接收用户提交的数据★

方式一:逐个接收要求:处理器方法的形参名要和请求中的参数名一致

//处理器类
@Controller
public class MyController {
    //逐个接收请求的参数,要求:处理器方法的形参名要和请求中的参数名一致
    @RequestMapping(value = "/receiveProperty.do",method = RequestMethod.POST)
    public ModelAndView doSome(String username, Integer age){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("username", username);
        modelAndView.addObject("age", age);
        modelAndView.setViewName("show");

        return modelAndView;
    }
}

//show.jsp源码

这是show.jsp从request作用域中获取数据


用户名是:${username}

年龄是:${age}

//index.jsp页面

请求参数名称与处理器方法形参名一致



方式二:对象接收 适合接收多个参数

在pojo包下创建vo包,再创建Student类,用来接收【处理器方法】中用户提交的数据
//接收【处理器方法】中用户提交的数据 的类
public class Student {
    //属性名与请求的参数名一样
    private String username;
    private Integer age;

    public String getUsername() { return username; }
    public void setUsername(String username) {
        System.out.println("setName:" + username);
        this.username = username;
    }
    public Integer getAge() { return age;}
    public void setAge(Integer age) {
        if (age>0 && age<200){
            System.out.println("setAge:" + age);
            this.age = age;
        }
    }
    @Override
    public String toString() {
        return "Student{" + "username='" + username + ''' + ", age=" + age + '}';
    }
}

//first.jsp页面

这是first.jsp从request作用域中获取数据


username数据是:${username}

age数据是:${age}

Student数据是:${student}

// 处理器类 @Controller public class MyController { @RequestMapping(value = "/receiveObject.do",method = RequestMethod.POST) public ModelAndView doFirst(Student student){ ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("username", student.getUsername()); modelAndView.addObject("age", student.getAge()); modelAndView.addObject("student", student); modelAndView.setViewName("first"); return modelAndView; } }
五、处理器方法的返回值 1.返回ModelAndView

该返回值表示有数据和视图,对视图执行 forward,应用:跳转页面并传参 (如上面例子)

2.返回String

该返回值表示视图,可以是逻辑名称或完整路径,应用:跳转页面 (默认不传参数,参数需要手动获取)
当返回的是完整的视图路径时,不能配置视图解析器

//处理器类
public class MyController {
    //处理器方法的返回值之String,表示视图名称或视图路径,需要配置视图解析器
    @RequestMapping(value = "/returnString-view.do",method = RequestMethod.POST)
    public String doReturnView(HttpServletRequest request, String username, Integer age){
        System.out.println("doReturnView,username="+username+",age="+age);

        //手动获取前端传递过来的值
        request.setAttribute("username", username);
        request.setAttribute("age", age);

        //返回视图逻辑名。执行效果:框架执行forward()方法进行转发
        return "show";
    }
}

//index.jsp

处理器方法的返回值之String,表示视图名称或视图路径




//show.jsp

这是show.jsp从request作用域中获取数据


用户名是:${username}

年龄是:${age}

3.返回void

不返回任何值,应用:在处理Ajax时使用 (此时处理器方法可以不返回值,由HttpServletResponse输出)

//index.jsp页面




//处理器类
@Controller
public class MyController {
//处理器方法返回void,响应ajax请求
@RequestMapping(value = "/returnVoid-ajax.do")
public void doReturnVoidAjax(HttpServletResponse response, String username, Integer age) throws Exception {
        //处理Ajax,使用json做数据格式 (使用Student表示处理结果)
        Student student = new Student();
        student.setUsername(username);
        student.setAge(age);

        //把结果对象转成json
        String json = "";
        if (student != null){
            ObjectMapper om = new ObjectMapper();
            json = om.writevalueAsString(student);
            System.out.println("student转换的json" + json);
        }

        //输出数据,响应ajax请求
        response.setContentType("application/json;charset=uft-8");
        PrintWriter pw = response.getWriter();
        pw.println(json);
        pw.flush();
    }
}
4.返回Object对象

该返回值表示数据,应用:将数据转成json输出到前端,响应ajax请求。将数据转化成json的步骤如下
示例功能同返回void对象是示例一样,但是更简单更方便 (框架自动实现的)。若返回的Object对象是list集合,则转为jsonArray输出

1.加入处理json的工具库依赖 (springmvc默认使用jackson)
2.在springmvc.xml文件中加入注解驱动 ()
3.在处理方法上面加入【@ResponseBody】注解
//index.jsp页面





//处理器类
@Controller
public class MyController {
	//处理器方法返回一个Object对象,通过springmvc将其转为json输出到前端,响应Ajax请求
    @RequestMapping(value = "/returnObject-Ajax.do")
    @ResponseBody
    public Student doReturnObjectAjax(String username, Integer age) {

        Student student = new Student();
        student.setUsername("lisi");
        student.setAge(20);

        return student;
    }

    //处理器方法返回一个【Objects集合】,通过springmvc将其转为jsonArray输出到前端,响应Ajax请求
    @RequestMapping(value = "/returnObjectArray-Ajax.do")
    @ResponseBody
    public List doReturnObjectAjaxArray(String username, Integer age) {
        ArrayList list = new ArrayList<>();

        Student student = new Student();
        student.setUsername("李四");
        student.setAge(20);
        list.add(student);

        student = new Student();
        student.setUsername("王五");
        student.setAge(28);
        list.add(student);

        return list;
    }
}
六、Idea创建SpringMVC要注意的事情 1.post提交方式导致的中文乱码

在web.xml文件中声明过滤器


    characterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
    
        encoding
        utf-8
    
    
    
        forceRequestEncoding
        true
    
    
    
        forceResponseEncoding
        true
    


    characterEncodingFilter
    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    	btime = System.currentTimeMillis();
        System.out.println("拦截器的preHandle方法");
        //true:放行所有请求,false:拦截所有请求
        return true;
    }

    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //对处理器方法的结果进行调整:实现转发
        if (modelAndView != null){
            modelAndView.addObject("mydate", new Date());
            modelAndView.setViewName("other");
        }

        System.out.println("拦截器的postHandle方法");
    }

    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器的afterCompletion方法");
        long etime = System.currentTimeMillis();
        System.out.println("从preHandler方法到请求处理完成的时间:" + (etime-btime) + "毫秒");
    }
}

创建show.jsp

这是show.jsp从request作用域中获取数据


用户名是:${username}

年龄是:${age}

配置springmvc.xml




    
    
    

    
    

    
    
        
        
    

    
    
        
            
            
            
            
        
    

2.多个拦截器的使用顺序

当有多个拦截器时,按在 springmvc.xml 中注册的先后来执行

3.拦截器与过滤器的区别

过滤器是 servlet 中的对象 (继承Filter);拦截器是 springmvc 中的对象 (实现HandlerInterceptor)
过滤器通过设置request、response的参数来实现对数据的过滤,在拦截器之前执行
拦截器是用来验证请求的,可以截断、修改请求,若请求不能被 中央调度器 接收,则不会被拦截器处理

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773567.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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