牛客网项目-Spring MVC入门

HTTP
HyperText Transfer Protocol。用于传输HTML等内容的应用层协议·规定了浏览器和服务器之间如何通信,以及通信时的数据格式。

在这里插入图片描述


Spring MvC·三层架构
表现层、业务层、数据访问层.

  • MVC
  • Model:模型层- View:视图层
  • Controller:控制层·
    核心组件
  • 前端控制器:DispatcherServlet

    在这里插入图片描述


    注意,不要把MVC的三层结构与三层架构对应
    MVC主要在表现层起作用,(其中包含的三层结构集体解决表现层的问题):controller接受请求数据,传到业务层,处理好的结果,封装成model,,再传给view层,view层返回一个html传给浏览器。

    springMVC核心图


    (重点)

    在这里插入图片描述


模板引擎
Thymeleaf
模板引擎

  • 生成动态的HTML。
  • Thymeleaf
    • 倡导自然模板,即以HTML文件为模板。
  • 常用语法
    • 标准表达式、判断与循环、模板的布局(页面复用等)。

https://www.thymeleaf.org

在这里插入图片描述


配置将Thymeleaf的缓存关掉(spring boot默认启用缓存;不然会有延迟,“上线启用,开发时关闭”)

server.port=8080
server.servlet.context-path=/community
spring.thymeleaf.cache=false//关闭缓存
实际上是给配置类注入数据

可以在这个网站上找到所有配置类相关的属性,查看

在这里插入图片描述

常用的配置:https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#appendix


怎么在controller里面获得请求和响应数据

   //怎么在controller里面获得请求和响应对象
    @RequestMapping("/http")
    public void http(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //注意,参数里用的都是接口
        //获取请求数据
        System.out.println(request.getMethod());
        System.out.println(request.getServletPath());
//        System.out.println(request.getHeaderNames());//得到key
        Enumeration<String> enumeration=request.getHeaderNames();
        while(enumeration.hasMoreElements()){
            String name=enumeration.nextElement();
            String value=request.getHeader(name);
            System.out.println(name+": "+value);
        }
        //请求体,包含的参数
        System.out.println(request.getParameter("code"));

        //返回响应的数据
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer=response.getWriter();
        //通过write向浏览器打印网页等
        writer.write("<h1>牛客网</h>");
    }

更简洁的方式

//更简洁的处理办法
    //GET请求怎么处理(默认的请求是get)
    //eg:查询所有学生: /students?current=1&limit=20
    @RequestMapping(path = "/students",method = RequestMethod.GET)
    @ResponseBody
    public String getStudents(
            @RequestParam(name = "current",required = false,defaultValue = "1") int current,
            @RequestParam(name = "limit",required = false,defaultValue = "10") int limit
    ){//int current,int limit
//        @RequestParam(name = "limit",required = false,defaultValue = "1") int limit意思是,
//        request中的参数limit赋值给当前的limit变量
        //只要定义的变量名和请求的参数名一致,就能得到此请求参数,当请求中万一没有带参数时,可以这么写
        System.out.println(current);
        System.out.println(limit);
        return "some students";
    }

传参数的另外一种方式:

  //查询一个学生,根据学生的id:/student/123:参数是路径的一部分
    @RequestMapping(path = "/student/{id}",method = RequestMethod.GET)
    @ResponseBody
    public String getStudent(@PathVariable("id") int id){
        System.out.println(id);
        return "a student";
    }

在这里插入图片描述


处理POST请求,首先建立一个静态网页

在这里插入图片描述

get请求传参不按钮,参数能看到

处理POST

//post请求获取参数
    @RequestMapping(path = "/student",method = RequestMethod.POST)
    @ResponseBody
    public String saveStudent(String name,int age){
        System.out.println(name);
        System.out.println(age);
        return "success";
    }
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>增加学生</title>
</head>
<body>
    <form method="post" action="/community/alpha/student">
      <p>
        姓名:<input type="text" name="name">
      </p>
      <p>
        年龄:<input type="text" name="age">
      </p>
      <p>
        <input type="submit" value="保存">
      </p>
    </form>
</body>
</html>

返回模板。动态html

     //响应html数据,以网页形式响应
    //此时就不需要加 @ResponseBody,默认返回html
    @RequestMapping(path = "/teacher",method = RequestMethod.GET)
    public ModelAndView getTeacher(){
        ModelAndView modelAndView=new ModelAndView();
        modelAndView.addObject("name","张三");
        modelAndView.addObject("age",30);
        //看模板需要多少对象
        //设置模板的名字和路径
        modelAndView.setViewName("/demo/view");//不用写成view.html,
        return modelAndView;//返回对象
    }

<!DOCTYPE html>
<html lang="en" xmlns:th="http:www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p th:text="${name}">
    </p>
    <p th:text="${age}"><!--模板引擎的特定语法-->
    </p>
</body>
</html>

返回网页
另一种方法

更推荐

    @RequestMapping(path = "/school",method = RequestMethod.GET)
    public String getSchool(Model model){
        //这个model是dispatchservlet调方法时,实例化后传过来的
        model.addAttribute("name","北京大学");
        model.addAttribute("age","years");
        return "/demo/view";//若返回的是String,则返回模板的路径
    }

向浏览器响应JSON数据,异步请求中:

 //向浏览器响应JSON数据,异步请求中:当前网页不刷新,但又访问了服务器,局部验证
    //Java对象,-->json(一种数据格式)-->JS对象,通过JSON实现两者的兼容,

    @RequestMapping(path = "/emp",method = RequestMethod.GET)
    @ResponseBody//要返回JSON数据,要加此说明,不然默认会返回html
    public Map<String,Object> getEmp(){
        Map<String,Object> emp=new HashMap<>();
        emp.put("name","张三");
        emp.put("age",23);
        emp.put("salary",8000);
        return emp;
    }

返回一组json

//返回一组员工
    @RequestMapping(path = "/emps",method = RequestMethod.GET)
    @ResponseBody//要返回JSON数据,要加此说明,不然默认会返回html
    public List<Map<String,Object>> getEmps(){
        List<Map<String,Object>> list=new ArrayList<>();
        Map<String,Object> emp=new HashMap<>();
        emp.put("name","张三");
        emp.put("age",23);
        emp.put("salary",8000);
        list.add(emp);
        emp=new HashMap<>();
        emp.put("name","李四");
        emp.put("age",25);
        emp.put("salary",7000);
        list.add(emp);

        emp=new HashMap<>();
        emp.put("name","王五");
        emp.put("age",28);
        emp.put("salary",4000);
        list.add(emp);
        return list;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340