SpringMVC 学习笔记 (day1 )-程序员宅基地

技术标签: spring  java  web  # Spring 全家桶学习  SpringMVC  

SpringMVC Maven 项目创建配置

一、添加东西 (构建项目更快)

解决 maven 构建项目慢的问题

 name: archetypeCatalog ,value: internal 

name:archetypeCatalog

value:: internal

二、运行第一个 Spring MVC 程序

2.1 Maven 配置
<properties>  
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  <maven.compiler.source>1.8</maven.compiler.source>  <maven.compiler.target>1.8</maven.compiler.target>  
	<!-- 指定 Spring 版本号 -->  
	<spring.version>5.2.3.RELEASE</spring.version>
</properties>

<dependencies>  
	<dependency>    
		<groupId>junit</groupId>    
		<artifactId>junit</artifactId>    
	<version>4.11</version>    
	<scope>test</scope>  
	</dependency>  
	<!-- spring start -->  
	<dependency>    
		<groupId>org.springframework</groupId>    
		<artifactId>spring-core</artifactId>    
		<version>${spring.version}</version>  
	</dependency>  
	
	<dependency>    
		<groupId>org.springframework</groupId>    
		<artifactId>spring-context</artifactId>    
		<version>${spring.version}</version>  
	</dependency>  
	
	<dependency>    
		<groupId>org.springframework</groupId>    
		<artifactId>spring-web</artifactId>    
		<version>${spring.version}</version>  
	</dependency>  

	<dependency>    
		<groupId>org.springframework</groupId>    
		<artifactId>spring-webmvc</artifactId>    
		<version>${spring.version}</version>  
	</dependency>  
	
	<dependency>    
		<groupId>javax.servlet</groupId>    
		<artifactId>javax.servlet-api</artifactId>    
		<version>4.0.0</version>    
		<scope>compile</scope>  
	</dependency>
</dependencies>
2.2 springmvc.xml 配置
<?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-3.0.xsd           http://www.springframework.org/schema/mvc           http://www.springframework.org/schema/mvc/spring-mvc.xsd           http://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-3.0.xsd">   
    <!-- 使用注解开发时,要告知 spring在创建容器时要扫描的包-->    
    <context:component-scan base-package="cn.gorit"></context:component-scan>    
    
    <!--    视图解析器-->    
    <bean id="internalResourceViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">        
        <property name="prefix" value="/WEB-INF/pages/"></property>        
        <property name="suffix" value=".jsp"></property>    
    </bean>    
    <!-- 开启 SpringMVC 注解的支持 -->    
    <mvc:annotation-driven/>
    
</beans>
  1. 启动服务器,加载一些配置文件
    • DispatcherServlet对象创建
    • springmvc.xml 被加载了
    • HelloController 创建成对象
      在这里插入图片描述
2.3 SpringMVC 中的组件控制器
  1. DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于 mvc 中的 c,dispatcherServlet 是整个流程控制中心,由它调用其他组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性

  1. HanderMapping:处理器映射器

HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了 不同的映射器实现不同的映射方式,例如配置文件方式,实现接口方式,注解方式等

  1. Handler:处理器

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet把用户请求转发送到 Handler。由 Handler 对具体用户请求进行处理

  1. HandlerAdapter:处理适配器

通过对 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器执行。

类比插座 和 接口

  1. View Resolver:视图解析器

View Resolver 负责将处理结果生成 View 视图, View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展现给用户

  1. View:视图

SpringMVC 框架提供很多 View 视图类型的支持,包括 jstlView,freemarkerView,pdfView等,我们最常用的视图就是 jsp。

一般情况下需要通过页面标签或页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发页面

  1. mvc:annitation-driven 说明
    在这里插入图片描述
2.3 web.xml 配置
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
	<web-app>  
		<display-name>Archetype Created Web Application</display-name>

    <!--  配置前端控制器,使用 SpringMVC-->  
    <servlet>    
        <servlet-name>dispatcherServlet</servlet-name>    
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    
        <init-param>      
            <param-name>contextConfigLocation</param-name>      
            <param-value>classpath:springmvc.xml</param-value>    
        </init-param>    

        <load-on-startup>1</load-on-startup>  
    </servlet>  

	<!-- 请求拦截 -->  
	<servlet-mapping>    
		<servlet-name>dispatcherServlet</servlet-name>    
		<url-pattern>/</url-pattern>  
	</servlet-mapping>
	
    <!--  配置解决中文乱码的过滤器-->
  <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>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
2.4 RequestMapping 讲解

作用:建立请求 URL 和处理请求方法之间对应的关系。

  1. path:指定请求路径 url
  2. value:value 属性和 path 属性是一样的
  3. method:指定该方法的请求方式
  4. params:指定限制请求参数的条件
  5. headers:发送请求中必须包含的请求头

三、请求参数的绑定

3.1 绑定的机制
  1. 请求参数绑定说明

    1. 绑定机制
      1. 表单提交的数据都是 k=v 形式 user=hehe&pwd=123
      2. SpringMVC 的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
      3. 要求:提交表单的 name 和 参数名称是相同的
    2. 支持的数据类型
      1. 基本数据类型和字符串类型
      2. 实体类型(JavaBean)
      3. 集合数据类型(List,map集合等)
  2. 基本数据类型和字符串类型

    1. 提交表单的 name 和参数的名称是相同的
    2. 区分大小写
  3. 实体类型(JavaBean)

    1. 提交表单的 name 和 javaBean 中的属性名称要一致

    2. 如果一个 JavaBean类中包含其他的引用类型,那么表单的 name 属性需要编写成:对象 属性:

      eg:address name

  4. 给集合属性数据封装

    1. JSP 页面编写方式:list[0] 属性, 封装对象表达式,对 前端的表单页面进行设置
  5. 请求参数中乱码解决(解决 post 请求乱码)

    1. web.xml 中配置 Spring提供的过滤器类 (上面的 web.xml 已经修改)
3.2 获得原生 Servlet API
    // 获取原生的 Servlet API
    @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response) {
    
        System.out.println("执行了");
        System.out.println(request.getRemoteUser());
        return "success";
    }

四、常用注解

4.1 RequestParam

作用:

​ 把请求中指定名称的参数给控制器中的形参赋值

属性:

​ value:请求参数的名称

​ required:请求参数中是否必须提交此参数

// jsp 代码
<a href="anno/testRequestParam?name=haha">常用注解</a>

@Controller
@RequestMapping("/anno")
public class AnnoController {
    

    @RequestMapping(value = "/testRequestParam")
    public String testAnno(@RequestParam(name="name") String username) {
    
        // 这样强制要求必须传 name,否则就把报错
        System.out.println("执行了");
        System.out.println("username:"+username);
        return "success";
    }
}

https://www.bilibili.com/video/BV1Sb411s7qa?p=18

4.2 RequestBody

作用:

​ 用于获取请求体内容,直接使用得到的是 key=value&key1=value1 … 结构的数据

​ 不适合 get 请求方法

赋值

​ value:请求参数的名称

​ required:是否必须有请求体,默认为:true,当取值为 get 时,请求方法会报错,如果

// jsp 代码
    <form action="anno/testRequestBody" method="post">
        用户姓名:<input type="text" name="username"><br>
        用户年龄:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

@Controller
@RequestMapping("/anno")
public class AnnoController {
    
    /**
     * 获取到请求体的内容
     * */
    @RequestMapping(value = "/testRequestBody")
    public String testRequestBody(@RequestBody String body) {
    
        System.out.println("执行了。。。");
        System.out.println(body);
        return "success";
    }
}

在这里插入图片描述

4.3 PathVariable
  1. 作用:拥有绑定 url 中的占位符的,例如:url中有/delete/{id},id 是占位符
  2. 属性:
    1. value:指定 url 中的占位符名称
  3. Restful 风格的 URL
    1. 请求路径一样,可以根据不同的请求方式执行后台的不同方法
    2. restful 风格的 URL 优点
      1. 结构清晰
      2. 符合标准
      3. 易于理解
      4. 扩展方便
// jsp 代码
    <a href="anno/testPathVariable/10">PathVariable</a>

@Controller
@RequestMapping("/anno")
public class AnnoController {
    

    /**
     * PathVariable 注解
     * */
    @RequestMapping("/testPathVariable/{sid}")
    public String testPathVariable(@PathVariable(name = "sid") String id) {
    
        System.out.println("执行了。。。");
        System.out.println(id);
        return "success";
    }
}

在这里插入图片描述

4.4 RequestHeader

作用:

​ 用于获取请求头消息

属性:

​ value:提供消息头名称

​ value:请求参数的名称

​ required:是否必须有此请求头

// jsp 代码
    <a href="anno/testRequestHeader">RequestHeader</a>

@Controller
@RequestMapping("/anno")
public class AnnoController {
    

    /**
     * 获取请求头的值
     * */
    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept") String header) {
    
        System.out.println("执行了。。。");
        System.out.println(header);
        return "success";
    }
}

在这里插入图片描述

4.5 CookieValue

作用:

​ 用于把指定 cookie 名称的值传入控制器方法参数

属性:

​ value:指定 cookie 的名称

​ required:是否必须有此 cookie

// jsp 代码
    <a href="anno/testCookieValue">CookieValue</a>

@Controller
@RequestMapping("/anno")
public class AnnoController {
    

    /**
     * 获取 Cookie 的值
     * */
    @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue) {
    
        System.out.println("执行了。。。");
        System.out.println(cookieValue);
        return "success";
    }
}

在这里插入图片描述

4.6 ModelAttribute

在这里插入图片描述

// jsp 代码
    <form action="anno/testModelAttribute" method="post">
        用户姓名:<input type="text" name="username"><br>
        用户年龄:<input type="text" name="age"><br>
        <input type="submit" value="提交">
    </form>

@Controller
@RequestMapping("/anno")
public class AnnoController {
    

    /**
     * testModelAttribute 注解
     * */
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute() {
    
        System.out.println("testModelAttribute 执行了。。。");
        return "success";
    }

    // 该方法会先执行
    @ModelAttribute
    public void showUser(String username, int age) {
    
        System.out.println("showUser 执行了");
        System.out.println(username);
        System.out.println(age);
        // 这里就可以进行数据库的一些操作了
    }
}

在这里插入图片描述

4.6 SessionAttribute

作用:

​ 用于多次执行控制器方法间的参数共享。

属性:

​ value:用于指定存入的属性的名称

​ type:用于指定存入的数据类型

// jsp 代码
    <a href="anno/testSessionAttributes">SessionAttributes</a>
        
// java 代码 存到 request 域当中
@Controller
@RequestMapping("/anno")
public class AnnoController {
    
    /**
     * testSessionAttributes 注解
     * */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model) {
    
        System.out.println("testSessionAttributes 执行了。。。");
        // 底层会存储到 request 域对象中
        model.addAttribute("msg","World");
        return "success";
    }

}

// 存到 session 对象中
@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {
    "msg"}) // 把 msg=World 存入到 session域中 (新增)
public class AnnoController {
    
    /**
     * testSessionAttributes 注解
     * */
    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model) {
    
        System.out.println("testSessionAttributes 执行了。。。");
        // 底层会存储到 request 域对象中
        model.addAttribute("msg","World");
        return "success";
    }

}

// pages/success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>跳转成功了</h3>
    ${
    requestScope}
    
	${
    sessionScope}
</body>
</html>

显示 request 域
在这里插入图片描述

显示 session 域
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/caidewei121/article/details/105930895

智能推荐

【原创】ARM LINUX 外部RTC实时时钟驱动移植(RX8025)_rx8025驱动-程序员宅基地

文章浏览阅读6.8k次。ARM LINUX 外部RTC实时时钟驱动移植(RX8025) Author: chad Mail: [email protected]开发板:AT91SAM9260 内核版本:linux-2.6.30解决办法如下: 第一步:修改board-sam9260ek.c文件修改/arch/arm/match-at91/board-sam9260ek.c,添加如下代码: 在ek_board__rx8025驱动

CTF Bugku GET_bugku get题-程序员宅基地

文章浏览阅读355次。进入场景后看到一串PHP源代码根据这源代码的提示,很容易想到使用GET方法来传递what参数以此来满足条件语句。所以在地址栏里面构造如下:回车之后,what参数的值就传过去了,flag也就出来了本题总结:难度不大,提示的已经很明确了。本题就是专门训练GET方法的。只要明白GET方法在url里面的呈现形式就可以很容易的做出这道题来。..._bugku get题

【Python CheckiO 题解】Three Words_python判three words-程序员宅基地

文章浏览阅读788次。CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,传送门:https://checkio.org/,本博客主要记录自己在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。题目描述【Three Words】:给定一个字符串,判断其是否为连续的三个单词(单词非单个字母),单词与数字之..._python判three words

Fabricjs使用Group实现组合对象_fabric.group-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏4次。场景Fabricjs一个简单强大的Canvas绘图库快速入门:Fabricjs一个简单强大的Canvas绘图库快速入门_BADAO_LIUMANG_QIZHI的博客-程序员宅基地在上面的基础上,可以实现在画布上添加对象,如果需要组合对象,并设置组合对象的功能属性可以使用new fabric.Group():接受两个参数。注:博客:BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_程序员宅基地-C#,SpringBoot,架构之路领域博主关注公众号霸道的程序猿获_fabric.group

【JDBC技术】终于知道Java底层是如何连接数据库了!——(8)Apache-DBUtils实现CRUD操作_如何使用apache dbutils连接数据库-程序员宅基地

文章浏览阅读3.9k次。JDBC 核心技术解析文章目录JDBC 核心技术解析Apache-DBUtils实现CRUD操作1. Apache-DBUtils简介2. 主要API的使用2.1 DbUtils2.2 QueryRunner类2.3 ResultSetHandler接口及实现类Apache-DBUtils实现CRUD操作1. Apache-DBUtils简介commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大_如何使用apache dbutils连接数据库

std::future-程序员宅基地

文章浏览阅读192次。1. future1. future1.1. future相关结构1.2. async相关结构1.3. packaged_task 相关结构1.4. promise相关结构1.5. 参考资料1.1. future相关结构Member functionsfundescpub/priv(constructor)constructs the future object(public member function)(destructor)destruc_std::future

随便推点

JFinal配置数据库连接池插件和表类映射_jfinal 数据库连接池插件-程序员宅基地

文章浏览阅读1.1k次。配置数据库连接池插件,此处以Druid为例,还需要配置数据库访问插件,即ActiveRecord插件,用于建立数据库中Table和Java Bean的mapping映射:public void configPlugin(Plugins me) { // 配置 druid 数据库连接池插件 DruidPlugin druidPlugin = new DruidPlu..._jfinal 数据库连接池插件

postfix的身份验证-程序员宅基地

文章浏览阅读648次。Postfixpostfix是WietseVenema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。postfix是WietseVenema想要为使用最广泛的sendmail提供替代品的一个尝试。在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真是一个让人吃惊的数字。Post..._postfix 身份验证

政府工程项目完工、交工和竣工的区别_项目竣工概念-程序员宅基地

文章浏览阅读3.2k次。政府工程项目完工、交工和竣工的区别完工:承建方按合同完成项目建设将设计文件转化为工程的工作。交工:工程通过业主组织的交工验收,承建方与业主进行工程交接、开始运营进入试运行阶段。竣工:一般是指正常运营一段时间(3年)后,工程通过业务验收合格,业务支付保留我。交工验收主要工作为:检查合同执行情况,评价工程质量,对参建单位进行初步评价。竣工验收主要工作为:对工程质量、参建单位进行综合评价,并对工程项目建设对行整体综合评价,如果项目建设目标是否达到预期效果。..._项目竣工概念

后渗透篇:清理windows入侵痕迹总结【详细】_当入侵主机后,攻击者清楚自己在系统中留下一些记录,现在需要对这些记录进行痕迹清-程序员宅基地

文章浏览阅读1.3w次,点赞6次,收藏61次。当你的才华还撑不起你的野心时那你就应该静下心来学习目录清理windows入侵痕迹0x01 前言了解为什么需要清除入侵痕迹?一、设置跳板二、必不可少的跳板三、代理服务器简介1)http代理服务器2)Sock5代理服务器3)VPN代理服务器四、使用Tor隐身了解需要删除哪些日志?1...._当入侵主机后,攻击者清楚自己在系统中留下一些记录,现在需要对这些记录进行痕迹清

光学时钟“升天”助力卫星精准导航_飞秒光学频率梳-程序员宅基地

文章浏览阅读290次。光学时钟“升天”助力卫星精准导航光学时钟“升天”助力卫星精准导航科学家们对于精准时间的追求从未停止,目前世界上最准的时钟当属光学时钟。虽然早有研究人员提出将光学时钟应用到卫星上,以提升卫星定位的准确程度,但如何保持光学时钟在太空中与地球上一样稳定发挥,一直是争论的焦点。1小时由60分钟组成,1分钟由60秒组成,那么1秒钟有多长?它是时钟上秒针的一格,也是电子时钟上数字的跳跃,但是1秒钟到底是多久,恐怕并没有多少人知道,也没有多少人关心。但科学家们对于精准时间的追求从未停止,目前世界上最准的时钟当属光_飞秒光学频率梳

bootstrap modal 垂直居中对齐_modal-dialog 浏览器居中 backdrop : 'static-程序员宅基地

文章浏览阅读830次。转载自:http://hbiao68.iteye.com/blog/2213168文章参考http://www.bubuko.com/infodetail-666582.htmlhttp://v3.bootcss.com/javascript/#modals Html代码 div class="modal fade" id="sqh_m_modal-dialog 浏览器居中 backdrop : 'static