编程语言
首页 > 编程语言> > Java框架--Spring MVC

Java框架--Spring MVC

作者:互联网

Spring MVC

执行流程

@RequestMapping

value

method

params

注意事项

Rset(优雅的url请求风格)

Representational State Transfer。(资源)表现层状态转化。是目前流行的请求方式。它结构清晰,很多网站采用

HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。(传统通过参数来说明crud类型,rest是通过请求类型来说明crud类型

REST的核心过滤器

应用

/**
 * 处理rest风格的请求,包括crud
 */
@RequestMapping("/user")
@Controller
public class BookHandler {

    @RequestMapping(value = "/book/{bookId}", method = RequestMethod.GET)
    public String getBook(@PathVariable("bookId") String bookId){
        System.out.println("查询书籍Id = " + bookId);
        return "success";
    }

    @RequestMapping(value = "/book", method = RequestMethod.POST)
    public String addBook(String bookName){
        System.out.println("添加书籍 = " + bookName);
        return "success";
    }

    @RequestMapping(value = "/book/{bookId}", method = RequestMethod.DELETE)
    public String delBook(@PathVariable("bookId") String bookId){
        System.out.println("delBook ID = " + bookId);
        //return "success"; //HTTP Status 405 - JSPs only permit GET POST or HEAD  由于jsp页面仅支持post、get请求
        return "redirect:/user/success"; //重定向自动转为get,临时使用,后续使用前端框架vue不存在此问题
    }

    @RequestMapping(value = "/book/{bookId}", method = RequestMethod.PUT)
    public String UpdBook(@PathVariable("bookId") String bookId){
        System.out.println("UpdBook ID = " + bookId);
        //return "success"; //HTTP Status 405 - JSPs only permit GET POST or HEAD  由于jsp页面仅支持post、get请求
        return "redirect:/user/success"; //重定向自动转为get,临时使用,后续使用前端框架vue不存在此问题
    }

    @RequestMapping(value = "/success")
    public String successGenecal(){
        return "success";
    }

}

映射请求数据

获取参数

开发中,会遇到请求的参数和实际方法形参名称不一致,这时候可以使用@RequestParam来映射请求中真正的参数,就类似于重新链接请求参数和实际方法形参(前面提到RequestMapping标识的方法如果提供了形参名,会从请求的参数中去匹配同名参数,不一致则置空,这里就可以重新关联)

/**
* 当形参和实际请求中的参数名不一致时,使用RequestParam(形参username,实际请求参数name)
* required = true,请求中就必须提供name参数,否则报错(反之不会报错,继续置空)
* @param username 用户名
* @return 视图解析
*/
@RequestMapping("/vote01")
public String test01(@RequestParam(value = "name", required = false) String username){
    System.out.println("得到username = " + username);
    return "success";
}

获取http请求头

/**
* 获取请求头参数
* @return 视图解析
*/
@RequestMapping("/vote02")
public String test02(@RequestHeader("Accept-Encoding") String ae,
                     @RequestHeader("HOST") String host){
    System.out.println("Accept-Encoding: " + ae);
    System.out.println("HOST: " + host);
    return "success";
}

获取javaBean形式的数据

开发中,客户提交表单本身就是一个javabean数据,springmvc支持直接将请求参数封装为一个javabean对象

/**
* 获取javaBean对象
* 直接在方法的形参上用对应的javaBean类型即可自动封装
* 注意1:自动封装会根据javaBean类型的属性字段名到请求参数中去找一致的值,不一致为null
* 注意2:如果属性是对象,请求的参数名为pet.id、pet.name,进行级联封装
* @return 视图解析
*/
@RequestMapping("/vote03")
public String test03(Master master){
    System.out.println("master = " + master);
    return "success";
}

//测试链接:  http://localhost:8080/springmvc/vote/vote03?id=1&name=szl&pet.id=2&pet.name=xh

获取原生servlet api

开发中,如果需要获取原生的servlet-api使用,需要先引入tomcat/lib下的servlet-api.jar,然后直接使用方法形参来获取

/**
* 获取servlet api, 来获取提交的数据
* @return 视图解析
*/
@RequestMapping("/vote04")
public String test04(HttpServletRequest request, HttpServletResponse response){
    String name = request.getParameter("name");
    System.out.println("name = " + name);
    return "success";
}

模型数据(域数据)

实际应用中,我们常常会用到数据传递,这时候就会用到模型数据的传递(域数据方式-可以回顾servlet基础),因为实际数据来源的地方可能是前端或者数据库

模型数据/域数据最简单的理解就是类似全局映射的map,web相关的代码片段都可以访问此map

数据放入request

开发中,控制器/处理器中获取的数据如何放入request域,然后在前端(VUE/JSP/...)取出显示

数据放入Session域

    /**
     * 把模型数据放入Session域
     * @return 视图解析
     */
    @RequestMapping("/vote08")
    public String test08(Master m, HttpSession httpSession){
        httpSession.setAttribute("address", "guangzhou...");
        httpSession.setAttribute("master", m);
        return "vote_ok";
    }

@ModelAttribute

开发中,有时需要使用某个前置方法(比如prepareXxx(),方法名由程序员定)给目标方法准备一个模型对象,@ModelAttribute注解标注一个方法之后,那么调用该Handler的任何一个方法时,都会先调用这个方法

    /**
     * ModelAttribute 标识后,此方法就变为前置方法
     * 它的作用域在本类所有方法前生效
     */
    @ModelAttribute
    public void prepareModel(){
        System.out.println("prepareModel() -----完成准备工作------");
    }

最佳实践:预先查询数据库准备数据,进行下一步处理

视图和视图解析器

在springmvc中的目标方法最终返回都是一个视图(有各种视图),返回的视图都会由一个视图解析器来处理(视图解析器有很多种)

自定义视图解析器:在默认情况下,我们都是返回默认的视图,然后这个返回的视图交由SpringMVC的InternalResourceViewResolver视图处理器来处理的;在实际开发中,我们有时需要自定义视图,这样可以满足更多更复杂的需求

视图解析器:原理是循环来执行每个视图解析器,根据配置的order值越小的先执行,如果执行成功返回,既结束后续的视图渲染,失败则继续执行下一视图(当配置了BeanNameViewResolver、InternalResourceViewResolver,根据优先级order值来for循环执行)

自定义视图

目标方法指定转发或重定向

@RequestMapping("/goods")
@Controller
public class GoodsHandler {
    /**
     * 演示直接指定要请求转发的或者是重定向的页面
     * @return
     */
    @RequestMapping(value = "/order")
    public String order() {
        System.out.println("=======order()=====");
        //请求转发到 /WEB-INF/pages/my_view.jsp
        //下面的 /WEB-INF/pages/my_view.jsp 被解析成 /springmvc/WEB-INF/pages/my_view.jsp
        //return "forward:/WEB-INF/pages/my_view.jsp";
        //return "forward:/aaa/bbb/ok.jsp";

        //直接指定要重定向的页面
        //1. 对于重定向来说,不能重定向到 /WEB-INF/ 目录下
        //2. redirect 关键字,表示进行重定向
        //3. /login.jsp 在服务器解析 /springmvc/login.jsp
        return "redirect:/login.jsp";

        // /WEB-INF/pages/my_view.jsp 被解析 /springmvc/WEB-INF/pages/my_view.jsp
        //return "redirect:/WEB-INF/pages/my_view.jsp";
    }
}

视图类型有很多种:redirect重定向 - RedirectView 、 forward转发 - InternalResourceView ......

它们都实现View接口,只要实现了就代表此类是视图,自定义视图就是实现了View接口,配置好自定义视图解析器即可同步加入使用

标签:return,String,--,Spring,视图,MVC,请求,public,RequestMapping
来源: https://www.cnblogs.com/shaozelong/p/16441305.html