spring5mvc第一天【大纲笔记】.pdfSpringMVC框架第一天【随堂笔记】.pdf
spring5mvc第一天【大纲笔记】.pdf

SpringMVC框架第一天【随堂笔记】.pdf

服务器三层框架

表现层:springmvc

业务层:spring

持久层:mybatis

批注 2019-04-08 194752.jpg

mvc设计模型

model(模型):通常指的就是数据模型(javabean对象)。作用一般情况下用于封装数据

view(视图):通常指jsp或者html。作用一般就是展示数据。通常视图是依据模型数据创建的。

controller(控制器):(servlet)是应用程序中处理用户交互的部分。作用一般就是处理业务逻辑的。

springmvc概述

是基于java的实现mvc设计模型的请求驱动类型的轻量级web框架。他通过一套注解,让一个简单的java类成为处理请求的控制器,而无需实现任何接口。同时还支持restful编程风格的请求。

批注 2019-04-08 200345.jpg

springMVC的优势

  1. 清晰的角色划分
    前端控制器(DispatcherServlet)
    请求到处理器的映射(HandlerMapping)
    处理器适配器(HandlerAdapter)
    视图解析器(ViewReaolver)
    处理器或页面控制器(Controller)
    验证器(Validator)
    命令对象(Command 请求参数绑定到的对象就叫命令对象)
    表单对象(Form Object 提供给表单展示的提交到的对象就叫表单对象)
  2. 分工明确,拓展点灵活
  3. 由于命令对象就是一个
  4. 和spring其他框架无缝集成,是其他web框架所不具备的
  5. 可适配,通过HandlerAdapter可以支持任意的类作为处理器
  6. 可定制性,HandlerMapping、ViewResolver等能够非常简单的定制
  7. 功能强大的数据验证、格式化、绑定机制
  8. 利用spring提供的Mock对象能够非常简单的进行web层单元测试
  9. 本地化、主题的解析的支持,使我们很容易进行国际化和主题的切换
  10. 强大的jsp标签库,使jsp编写更加容易
    。。。。还有RESTFUL风格的支持、简单的文件上传、约定大于配置的契约式编程支持、基于注解的零配置支持等等。

springmvc和struts2的优略分析

批注 2019-04-09 210511.jpg

springMVC入门程序的配置

1.搭建环境

file - new - module - maven -
批注 2019-04-10 184724.jpg

批注 2019-04-10 184749.jpg

批注 2019-04-10 185024.jpg

创建完成

2.创建文件夹

在main下创建java和resources文件夹,再设置

批注 2019-04-10 185831.jpg
批注 2019-04-10 185924.jpg

3.pom.xml文件中引入jar包

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <maven.compiler.source>1.8</maven.compiler.source>
  4. <maven.compiler.target>1.8</maven.compiler.target>
  5. <spring.version>5.0.2.RELEASE</spring.version>
  6. </properties>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-context</artifactId>
  11. <version>${spring.version}</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-web</artifactId>
  16. <version>${spring.version}</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-webmvc</artifactId>
  21. <version>${spring.version}</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>javax.servlet</groupId>
  25. <artifactId>servlet-api</artifactId>
  26. <version>2.5</version>
  27. <scope>provided</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>javax.servlet.jsp</groupId>
  31. <artifactId>jsp-api</artifactId>
  32. <version>2.0</version>
  33. <scope>provided</scope>
  34. </dependency>
  35. </dependencies>

4.配置前端控制器

src - main - webapp - WEB-INF - web.xml

<!--前端控制器-->
  <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>

5.配置springmvc

在resources右键new一个springmvc.xml文件

批注 2019-04-10 191858.jpg

配置beans标签

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.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.xsd">

</beans>

6.配置服务器

配置tomcat服务器
批注 2019-04-10 192335.jpg

批注 2019-04-10 192516.jpg

springMVC入门程序代码编写

1.删除index.html后再新建index.html或新建一个html文件

编写内容

<%--
  Created by IntelliJ IDEA.
  User: 17273
  Date: 2019/4/10
  Time: 19:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h3>入门程序</h3>

<a href="hello">入门程序</a>


</body>
</html>

2.再在java中新建一个java文件

package cn.itcast.controller;
//控制类
public class HelloController {
    public String sayHello(){
        System.out.println("hello stringmvc");
        return "success";
    }
}

3.开启注解扫描

在springmvc.xml中添加扫描

<!--开启注解扫描-->
<context:component-scan base-package="cn.itcast"/>

在java文件的类中添加注解@Controller

再在方法上添加请求映射注解@RequestMapping(path = “/hello”),path表示路径

4.使springmvc.xml加载

在前端控制器servlet标签中添加全局初始化参数

<!--加载那个文件-->
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--什么时候创建-->
<load-on-startup>1</load-on-startup>

5.新建跳转页面

在web-inf下新建一个文件夹pages,再新建一个success.jsp文件

6.跳转到success页面

  1. 在springmvc.xml中配置视图解析器,帮助javabean跳转到指定页面

    <!--视图解析器对象-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <!--文件夹-->
     <property name="prefix" value="/WEB-INF/pages/"/>
     <!--文件后缀-->
     <property name="suffix" value=".jsp"/>
    </bean>
    
  2. 开启springMVC框架注解的支持

    <!--开启springmvc框架注解的支持-->
    <mvc:annotation-driven/>
    

批注 2019-04-11 174434.jpg

入门程序总结

批注 2019-04-11 172847.jpg
批注 2019-04-11 173114.jpg

RequestMapping注解

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

属性

   path:指定请求路径的url

   value:用于指定请求的url。它和path属性的作用是一样的。

   method:用于指定请求的方式。

   params:用于指定限制请求参数的条件。他支持简单的表达式。要求请求参数的key和value必须和配置一模一样。

例如:

params = {"username"}//传入的参数属性必须是username
params = {"username=hehe"}//插入的属性必须是username,值必须是hehe
   headers:用于限制请求消息头的条件。发送的请求中必须包含的请求头
headers = {"Accept"}//请求头中必须有Accept

限制请求方式

@RequestMapping(value = "/testRequestMapping",method = {RequestMethod.POST})

当请求方式不同将报错405
批注 2019-04-11 200942.jpg

请求参数的绑定

1.普通参数的绑定

直接在方法上添加

<a href="param/testParam?username=hehe">请求参数绑定</a>
    /**
     * 请求参数绑定
     * @param username
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username){
        System.out.println(username);
        return "success";
    }

2.多个参数绑定

<a href="param/testParam?username=hehe&password=123">请求参数绑定</a>
    @RequestMapping("/testParam")
    public String testParam(String username  ,String password){
        System.out.println(username);
        System.out.println(password);
        return "success";
    }

3.javabean的封装

属性较多,统一管理

<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/>
    金额:<input type="text" name="money"/><br/>
    <input type="submit" value="提交"/>
</form>

创建Javabean

/**
 * 实现序列化接口Serializable
 */
public class Account implements Serializable {
    private String username;
    private String password;
    private Double money;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", user=" + user +
                '}';
    }
}
    /**
     * 请求参数绑定把数据封装到javabean的类中
     * @param account
     * @return
     */
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println("saveAcount");
        System.out.println(account);
        return "success";
    }

4.应用类型传值

创建user类

public class User implements Serializable {
    private String uname;
    private Integer age;

    private Date date;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }
}

在account中添加user类

    private User user;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", user=" + user +
                '}';

jsp

    用户姓名:<input type="text" name="user.uname"/><br/>
    用户年龄:<input type="text" name="user.age"/><br/>

中文乱码问题

配置过滤器
在web.xml中配置

  <!--解决中文乱码的过滤器-->
  <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>

5.封装集合

account中添加表单

    private List<User> list;
    private Map<String,User> map;
    public List<User> getList() {
        return list;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }

jsp

<%--把数据封装account类中,类中存在list和map集合--%>
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/>
    金额:<input type="text" name="money"/><br/>
    <!--list-->
    用户姓名:<input type="text" name="list[0].uname"/><br/>
    用户年龄:<input type="text" name="list[0].age"/><br/>
    <!--map-->
    用户姓名:<input type="text" name="map['one'].uname"/><br/>
    用户年龄:<input type="text" name="map['one'].age"/><br/>
    <input type="submit" value="提交"/>
</form>

自定义类型转换器

从jsp中闯入的数据都是string类型的,springmvc会自动将string类型的数据转成设计的类型,基本类型都可以转,但存在一个问题,不同的格式可能会导致失败。

例:字符串2000/01/05可以转成日期2000年1月5日,但2000-01-05可能就转不了

jsp中重写一个表单

<form action="param/saveUser" method="post">
    用户姓名:<input type="text" name="uname"/><br/>
    用户年龄:<input type="text" name="age"/><br/>
    用户生日:<input type="text" name="date"/><br/>
    <input type="submit" value="提交"/>
</form>

user中添加一个属性date

private Date date;
public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }

controller中加一个方法saveUser

@RequestMapping("/saveUser")
public String saveUser(User user){
    System.out.println("执行了");
    System.out.println(user);
    return "success";
}

测试:
批注 2019-04-17 195344.jpg
批注 2019-04-17 195431.jpg
批注 2019-04-17 195500.jpg
批注 2019-04-17 201046.jpg

解决步骤:

  1. 新建一个类型转换器until.stringtodateconvrter
import org.springframework.core.convert.converter.Converter;

import java.text.*;
import java.util.Date;

/**
 * 把字符串转换日期,string指传入的字符串,date指要转的类型(这里是转日期类型)
 */
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String s) {
        //判断
        if (s == null){
            throw new RuntimeException("请您传入数据");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            //把字符串转换日期
            return df.parse(s);
        } catch (ParseException e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}
  1. 在springmvc.xml中配置类型转换器组件
<!--配置自定义类型转换器-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="cn.itcast.util.StringToDateConverter"></bean>
        </set>
    </property>
</bean>
  1. 让组件生效

在springmvc.xml中的mvc:annotation-driven标签中添加conversion-service

<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>

获取servlet原生API

想获得什么就在controller的方法上加参数就行

构建一个方法获取

@RequestMapping("/testServlet")
public String saveServlet(HttpServletRequest request, HttpServletResponse response){
    //获取的都是地址
    System.out.println("执行了");
    //获取地址确定是否获取到api
    System.out.println(request);
    HttpSession session = request.getSession();
    System.out.println(session);
    ServletContext servletContext = session.getServletContext();
    System.out.println(servletContext);
    System.out.println(response);
    return "success";
}

常用注解

1.requestparam

作用:
把请求中指定名称的参数给控制器中的形参赋值(jsp的参数名可与方法中的不同)
属性:
value:请求参数中的名称
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,否则报错

<a href="anno/testRequestParam?name=哈哈">Servlet原生API</a>
@Controller
@RequestMapping("/anno")
public class AnnoController {
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(name="name") String username ){
        System.out.println("执行了。。。");
        System.out.println(username);
        return "success";
    }
}

2.RequestBody(异步使用)

作用:
用于获取请求体内容。直接使用得到是key=value&key=value…结构的数据
get请求方式不适用
属性:
required:是否必须有请求体。默认值是:true。当取值为true时,get请求方式会报错。如果取值为fasle,get请求得到的是null。

<form action="anno/testRequestBody" method="post">
    用户姓名:<input type="text" name="username"/><br/>
    用户年龄:<input type="text" name="age"/><br/>
    <input type="submit" value="提交"/>
</form>
    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body ){
        System.out.println("执行了。。。");
        System.out.println(body);
        return "success";
    }

image.png

3.PathVariable

作用:
用于绑定URL中的占位符。URL支持占位符是spring3.0之后加入的。是springmvc支持rest风格URL的重要标志
例:请求url中/delete/{id},这个{id}就是URL占位符。
属性:
value:用于指定URL中占位符名称
required:是否必须提供占位符

<a href="anno/testPathVariable/10">testPathVariable</a>
<!--直接接数值-->
    @RequestMapping("/testPathVariable/{sid}")
    public String testPathVariable(@PathVariable(name="sid")  String id ){
        System.out.println("执行了。。。");
        System.out.println(id);
        return "success";
    }

4.HiddentHttpMethodFilter过滤器

作用:由于浏览器from表单只支持GET和POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们控制器方法,使得支持GET、POST、PUT与DELETE请求。
方法:
第一步:在web. xml中配置该过滤器
第二步:请求方式必须使用post请求
第三步:按照要求提供method请求参数,该参数的取值就是我们需要的请求方式

只需了解,webclient使用静态方法发送请求,模拟各种请求方式,浏览器也有插件来实现

5.requestheader注解(了解)

作用:
用于获取请求消息头

<a href="anno/testRequestHeader">testRequestHeader</a>
    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value = "Accept") String header){
        System.out.println("执行了。。。");
        System.out.println(header);
        return "success";
    }

6.CookieValue

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

<a href="anno/testCookieValue">testCookieValue</a>
    @RequestMapping("/testCookieValue")
    public String testCookieValue(@CookieValue(value ="JSESSIONID") String cookieValue){
        System.out.println("执行了。。。");
        System.out.println(cookieValue);
        return "success";
    }

7.ModelAttribute

作用:
可修饰方法和参数,出现方法上,表示当前方法会在控制器方法执行之前执行。可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。可以出现在参数上,获取指定的数据给参数赋值。
方法1 :

<form action="anno/testModelAttribute" method="post">
    用户姓名:<input type="text" name="uname"/><br/>
    用户年龄:<input type="text" name="age"/><br/>
    <input type="submit" value="提交"/>
</form>
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute( User user){
        System.out.println("执行了。。。");
        System.out.println(user);
        return "success";
    }

    @ModelAttribute
    public User showUser(String uname){
        System.out.println("showUser执行了。。。");
        User user = new User();
        user.setUname(uname);
        user.setAge(20);
        user.setDate(new Date());
        return user;
    }

方法二:

    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("abc") User user){
        System.out.println("执行了。。。");
        System.out.println(user);
        return "success";
    }

    @ModelAttribute
    public void showUser(String uname , Map<String,User> map){
        System.out.println("showUser执行了。。。");
        User user = new User();
        user.setUname(uname);
        user.setAge(20);
        user.setDate(new Date());
        map.put("abc",user);
    }

8. SessionAttributes

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

    @RequestMapping(value = "/testSessionAttributes")
    public String testSessionAttributes(Model model){
        System.out.println("testSessionAttributes。。。");
        model.addAttribute("msg","美美");
        return "success";
    }
    @RequestMapping(value = "getSessionAttributes")
    public String getSessionAttributes(ModelMap modelMap){
        System.out.println("getSessionAttributes");
        String msg =(String) modelMap.get("msg");
        System.out.println(msg);
        return "success";
    }
<a href="anno/testSessionAttributes">testSessionAttributes</a>
<a href="anno/getSessionAttributes">SessionAttributes</a>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>成功</h3>
${requestScope.msg}
${sessionScope}
</body>
</html>