SSM三大框架之SpringMVC.....(入门到了解)

如有侵权请联系删除

这是个人通过网上教学视频的总结:视频网址:https://www.bilibili.com/video/BV1mE411X7yp?p=164

Springmvc从头到尾讲解

以下是一些案例中用到的资料,如果有兴趣的可以下载以下
链接: https://pan.baidu.com/s/1bV0RbnkB0ww2karAquwh2A 提取码: funa

这个作者视频讲的很详细有空可以关注一下啊

在这里插入图片描述
首先以上的图片是服务器分为的三大框架,还有大概的运行顺序,接下来给大家讲解一下MVC(该博客讲解主要以截图为重)

什么是springmvc

在这里插入图片描述

Springmvc的优点

在这里插入图片描述

idea开发工具 Springmvc入门

首先我们先进行搭建环境

  1. 创建WEB工程,引入开发的jar包
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在pom文件里面引入以下jar包注(里面只需要添加一个版本号即可)

<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>
    //下面的这段代码是为了写一个版本号,这样jar包就不用重复写版本号了
    <spring.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <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>servlet-api</artifactId>            <version>2.5</version>            <scope>provided</scope>        </dependency>

    <dependency>            <groupId>javax.servlet.jsp</groupId>            <artifactId>jsp-api</artifactId>            <version>2.0</version>            <scope>provided</scope>        </dependency>
  </dependencies>```
  1. 在webapp/WEB-INF/web.xml配置核心的控制器(配置DispatcherServlet)
<!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>
  <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>
  <!--/ 表示你发任何请求都会经过这个servlet-->
  <url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
  1. 在resource文件中创建springmvc.xml文件,并且编写springmvc.xml的配置文件
<?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"
       xmlns:xontext="http://www.springframework.org/schema/context"
       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">
<!--  开启注解扫描  -->
    <xontext:component-scan base-package="cn.lc"/>
<!--  配置 试视图解析器用来识别controller返回对象,也就是跳转到对应jsp   id随便定义-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--    prefix:表示文件所在的目录    suffi表示文件的后缀名-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
<!--  开启springmvc框架注解的支持  -->
    <mvc:annotation-driven/>

</beans>

接下来进行一个小案例练习

  1. 编写index.jsp和HelloController控制器类,结构如下图所示

在这里插入图片描述

a:index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<a href="hello">入门程序</a>
</body>
</html>

b:HelloController控制类

package cn.lc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

//控制器
//把这个类交给ioc容器
@Controller
public class HelloController {
    //请求的映射
    @RequestMapping(path="/hello")
    public String sayHello(){
        System.out.println("hello stringmvc");
        return  "success";
    }

}

c:WEB-INF目录下创建pages文件夹,编写success.jsp的成功页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>入门成功了</h3>
</body>
</html>
  1. 入门案例的执行流程
  2. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件
  3. 开启了注解扫描,那么HelloController对象就会被创建
  4. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到执行的具体方法
  5. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
  6. Tomcat服务器渲染页面,做出响应
  7. SpringMVC官方提供图形
  8. 入门案例中的组件分析
  9. 前端控制器(DispatcherServlet)
  10. 处理器映射器(HandlerMapping)
  11. 处理器(Handler)
  12. 处理器适配器(HandlAdapter)
  13. 视图解析器(View Resolver)
  14. 视图(View)
  15. RequestMapping注解
  16. RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系
  17. RequestMapping注解可以作用在方法和类上
  18. 作用在类上:第一级的访问目录
  19. 作用在方法上:第二级的访问目录
  20. 细节:路径可以不编写 / 表示应用的根目录开始
  21. 细节:${ pageContext.request.contextPath }也可以省略不写,但是路径上不能写 /
  22. RequestMapping的属性
  23. path 指定请求路径的url
  24. value value属性和path属性是一样的
  25. mthod 指定该方法的请求方式
  26. params 指定限制请求参数的条件
  27. headers 发送的请求中必须包含的请求头

请求参数绑定

绑定机制
  1. 表单提交的数据都是k=v格式的 username=haha&password=123
  2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
  3. 要求:提交表单的name和参数的名称是相同的
支持的数据类型
  1. 基本数据类型和字符串类型(分别有对应的代码解析)
    a:在webapp下创建一个params.jsp(名字随便定义)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--请求参数绑定--%>
<a href="param/testParam?username=hehe">请求参数绑定</a>
</body>
</html>

b:在controller包中创建一个Paramcontroller

package cn.lc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/*
请求参数的绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/testParam")
    public  String testParam(String username){
        System.out.println("执行了。。。");
        System.out.println("用户名=:"+username);
        return "success";
    }
}

注意:如果在jsp里面存在username这个值那么在controller也必须添加否则无法执行

  1. 实体类型(JavaBean)
    把之前params.jsp修改一下就好
<-- 这个是为了可以防止输出中文的时候出现乱码 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--请求参数绑定
<a href="param/testParam?username=hehe">请求参数绑定</a>--%>
<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>

</body>
</html>

b:在ParamController增加一个方法代码如下

 /*
    把数据封装到 javabean的类中
     */
    @RequestMapping("/saveAccount")
    public  String saveAccount(Account account){
        System.out.println("执行了。。。");
        System.out.println(account);
        return "success";
    }
  1. 集合数据类型(List、map集合等)
    a:修改之前的jparams.jspsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username"><br/>
    密码:<input type="text" name="password"><br/>
    金额:<input type="text" name="money"><br/>
    <%-- 把user对象存到list集合中下标为0的里面 --%>
    用户姓名:<input type="text" name="list[0].uname"><br/>
    用户年龄:<input type="text" name="list[0].age"><br/>

    用户姓名:<input type="text" name="map['one'].uname"><br/>
    用户年龄:<input type="text" name="map['one'].age"><br/>
    <input type="submit" value="提交"/>
</form>

</body>
</html> 

b:修改一下封装类Account前几个步骤没有写不过都用的是一个封装类

package cn.lc.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Account implements Serializable {
    private String username;
    private String password;
    private Double money;
    //private User user;
    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;
    }
    //    public User getUser() {
//        return user;
//    }
//
//    public void setUser(User user) {
//        this.user = user;
//    }

    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 +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}
基本数据类型和字符串类型
  1. 提交表单的name和参数的名称是相同的
  2. 区分大小写
实体类型
  1. 提交表单的name和JavaBean中的属性名称需要一致
  2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如: address.name
给集合属性封装数据
  1. JSP页面编写方式:list[0].属性
请求参数中文乱码的解决

只需要在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>
自定义类型转换器
  1. 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明
    Spring框架内部会默认进行数据类型转换。
  2. 如果想自定义数据类型转换,可以实现Converter的接口
  3. 自定义类型转换器(日期格式)

代码体验一下

创建一个StringToDateConverter类但是必须继承Converter接口,这是规定

package cn.lc.utils;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
把字符串转换为日期
 */
public class StringToDateConverter implements Converter<String, Date>{
    /**
     * String source    传入进来字符串
     * @param source
     * @return
     */
    @Override
    public Date convert(String source) {
        if(source == null){
            throw new RuntimeException("请您传入数据");
        }
        //转换时间格式
        SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
        //把字符串转换为日期
        try {
           return df.parse(source);
        } catch (Exception e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}

接下里第二步:注册自定义类型转换器,在springmvc.xml配置文件中编写配置

<!--  配置自定义的类型转换器  id的值可以随便写-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
          <set>
              <bean class="cn.lc.utils.StringToDateConverter"></bean>
          </set>
        </property>
    </bean>
<!--  开启springmvc框架注解的支持  配置conversion-service="conversionService"是为了让自定义的类型转换器生效-->
    <mvc:annotation-driven conversion-service="conversionService"/>

在这里插入图片描述

运行结果
在这里插入图片描述

接下来的案列我都会把案例结果附图,上面案列因为时间关系没有附图和运行结果,还请大家理解

在控制器中使用原生的ServletAPI对象

只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象
接下来代码演示走一波
a: 首先把params.jsp的代码进行修改

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--请求参数绑定
<a href="param/testParam?username=hehe">请求参数绑定</a>--%>

<%--<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="text" name="user.uname"><br/>--%>
<%--    用户年龄:<input type="text" name="user.age"><br/>--%>
<%--    <input type="submit" value="提交"/>--%>
<%--</form>--%>

<%--把数据封装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/>
    <%-- 把user对象存到list集合中下标为0的里面
    用户姓名:<input type="text" name="list[0].uname"><br/>
    用户年龄:<input type="text" name="list[0].age"><br/>

    用户姓名:<input tsaveUserype="text" name="map['one'].uname"><br/>
    用户年龄:<input type="text" name="map['one'].age"><br/>
    <input type="submit" value="提交"/>
</form>--%>

<%--自定义类型转换器
<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>--%>
<a href="param/testServlet">Servlet原生的API</a>
</body>
</html>

b:在ParamController增加一个testServlet方法

   /*
    Servlet原生态API获取
    找想要查询的类ctrl+n
     */
    @RequestMapping("/testServlet")
    //想要获取API直接在方法里面写入想要获取的参数即可
    public  String testServlet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("执行了。。。");
        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注解

作用:把请求中的指定名称的参数传递给控制器中的形参赋值
属性
value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供

代码如下

a:在webapp下面创建一个anno.jsp

<html>
<head>
    <title>Title</title>
</head>
<body>

<%--常用的注解   在下面的超链接当中有一个username--%>
<a href="anno/tesRtequestParam?name=haha"?>RequestParam</a>

</html>

b:在package cn.lc.controller;包下创建AnnoController类

package cn.lc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/anno")
public class AnnoController {
    @RequestMapping("/tesRtequestParam")
    //前面我们说过如果jsp里面有username=“”这段代码,那么意味着方法的参数里面也许要有对应的username,否则返回的是一个null
    //@RequestParam这个注解就是为了让方法里面参数的值随便些,不需要和jsp里面的保持一致,但是注解中name的值必须和jsp里面传入的名字保持一致
    public String tesRtequestParam(@RequestParam(name="name") String username){
        System.out.println("执行了");
        System.out.println(username);
        return "success";
    }
}

注意:
前面我们说过如果jsp里面有username=“”这段代码,那么意味着controller层中方法的参数里面也必须要有对应的username,否则返回的是一个null
@RequestParam这个注解就是为了让方法里面参数的值随便些,不需要和jsp里面name的保持一致,但是注解中name的值必须和jsp里面传入的名字保持一致

启动服务器出现如下图片
在这里插入图片描述
idea控制台输出结果
在这里插入图片描述

2.RequestBody注解

作用:用于获取请求体的内容(注意:get方法不可以)
属性
required:是否必须有请求体,默认值是true

代码如下
a: 在anno.jsp中添加代码

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

<%--常用的注解--%>
<a href="anno/tesRtequestParam?name=哈哈"?>RequestParam</a>

<br>

<form action="anno/tesRtequestBody" method="post">

    用户姓名:<input type="text" name="username"><br/>
    用户年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交"/>
</form>

</html>

b:在AnnoController类中添加测试注解tesRtequestBody方法

/**
     * 获取到请求体的内容
     * @param body
     * @return
     */
    @RequestMapping("/tesRtequestBody")
    //@RequestBody表示我想拿到anno.jsp中的请求体的内容
    public String tesRtequestBody(@RequestBody String body){
        System.out.println("执行了");
        System.out.println(body);
        return "success";
    }

启动服务器
在这里插入图片描述

idea控制器输出结果
在这里插入图片描述

3. PathVariable注解

作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
2. 属性
value:指定url中的占位符名称
Restful风格的URL
请求路径一样,可以根据不同的请求方式去执行后台的不同方法
restful风格的URL优点
结构清晰
符合标准
易于理解
扩展方便

代码如下(在之前的代码中直接添加新代码有重复代码可忽略)
a:在anno.jsp中写如下代码

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

<%--常用的注解--%>
<a href="anno/tesRtequestParam?name=哈哈"?>RequestParam</a>

<br>

<form action="anno/tesRtequestBody" method="post">

    用户姓名:<input type="text" name="username"><br/>
    用户年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交"/>
</form>

<a href="anno/testPathVariable/10">testPathVariable</a>
</html>

b:在AnnoController添加testPathVariable方法

/**
     * @PathVariable注解
     * @param id
     * @return
     */
    @RequestMapping("/testPathVariable/{sid}")
    //@RequestBody表示我想拿到anno.jsp中的请求体的内容
    public String testPathVariable(@PathVariable(name = "sid") String id){
        System.out.println("执行了");
        System.out.println(id);
        return "success";
    }

在这里插入图片描述

在这里插入图片描述

4. RequestHeader注解

作用:获取指定请求头的值
属性
value:请求头的名称

代码解析如下:

a:在anno.jsp中写如下代码

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

<%--常用的注解--%>
<a href="anno/tesRtequestParam?name=哈哈"?>RequestParam</a>

<br>

<form action="anno/tesRtequestBody" method="post">

    用户姓名:<input type="text" name="username"><br/>
    用户年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交"/>
</form>

<a href="anno/testPathVariable/10">testPathVariable</a>

<br>

<a href="anno/testRequestHeader">RequestHeader</a>

</html>

b:在AnnoController类中添加testRequestHeader方法

 /**
     * testRequestHeader注解
     * @param header
     * @return
     */
    @RequestMapping("/testRequestHeader")
    //@RequestBody表示我想拿到anno.jsp中的请求体的内容
    public String testRequestHeader(@RequestHeader(value = "Accept") String header){
        System.out.println("执行了");
        System.out.println(header);
        return "success";
    }

启动服务器
在这里插入图片描述

idea编译器显示如下图所示

在这里插入图片描述

5. CookieValue注解

作用:用于获取指定cookie的名称的值
属性
value:cookie的名称
a:在anno.jsp中写如下代码

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

<%--常用的注解--%>
<a href="anno/tesRtequestParam?name=哈哈"?>RequestParam</a>

<br>

<form action="anno/tesRtequestBody" method="post">

    用户姓名:<input type="text" name="username"><br/>
    用户年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交"/>
</form>

<a href="anno/testPathVariable/10">testPathVariable</a>

<br>

<a href="anno/testRequestHeader">RequestHeader</a>

<a href="anno/testCookieValue">CookieValue</a>

<br>

</html>

b:在AnnoController类中添加testCookieValue方法

 /**
     * testRequestHeader注解
     * @param cookieValue
     * @return
     */
    @RequestMapping("/testCookieValue")
    //@RequestBody表示我想拿到anno.jsp中的请求体的内容
    public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
        System.out.println("执行了");
        System.out.println(cookieValue);
        return "success";
    }

idea控制器输出如下
在这里插入图片描述

6. ModelAttribute注解

作用:

  1. 出现在方法上:表示当前方法会在控制器方法执行前先执行。
  2. 出现在参数上:获取指定的数据给参数赋值。

应用:
3. 当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。

首先我们用代码解析执行以下这个注解的第一个作用

a:老规矩在anno.jsp里面添加如下代码

<form action="anno/testModelAttribute" method="post">

    用户姓名:<input type="text" name="username"><br/>
    用户年龄:<input type="text" name="age"><br/>
    <input type="submit" value="提交"/>
</form>

<br>

b:在AnnoController里面添加一个testModelAttribute方法

 /**
     * ModelAttribute 注解
     * @param
     * @return
     */
    @RequestMapping("/testModelAttribute")
    //@RequestBody表示我想拿到anno.jsp中的请求体的内容
    public String testModelAttribute(){
        System.out.println("testModelAttribute执行了");
        return "success";
    }
    //下面这个方法会先执行
    @ModelAttribute
    public void showUser(){
        System.out.println("showUser执行了");
    }

运行服务器以下结果
在这里插入图片描述

控制台编译结果

在这里插入图片描述

在这里看出加ModelAttribute注解的这个方法会先执行

接下来我们进行第二个作用的代码解析

直接修改AnnoController中的代码

@ModelAttribute
    public User showUser(String uname){
        System.out.println("showUser执行了");
        //通过用户查询数据库(模拟)
        User u = new User();
        u.setUname(uname);
        u.setAge(20);
        u.setDate(new Date());
        return u;
    }

启动服务器
在这里插入图片描述

idea编译运行结果为
在这里插入图片描述

以上内容是第一部分讲解,接下来进行第二部分

首先我们先进行环境搭建

创建一个项目springmvc_day02_01_response1(名字可以随便写)

1.按照第一部分的配置来写一遍
注意(别忘记在java中创建两个文件)
在这里插入图片描述

2.配置pom文件

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>springmvc_day02_01_response1</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>springmvc_day02_01_response1 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <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.version>5.0.2.RELEASE</spring.version>
  </properties>

  <dependencies>
    <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>servlet-api</artifactId>            <version>2.5</version>            <scope>provided</scope>        </dependency>

    <dependency>            <groupId>javax.servlet.jsp</groupId>            <artifactId>jsp-api</artifactId>            <version>2.0</version>            <scope>provided</scope>        </dependency>
  </dependencies>

  <build>
    <finalName>springmvc_day02_01_response1</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

3.修改springxml配置文件(就是去掉了自定义的类型转换器的配置)代码如下

<?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"
       xmlns:xontext="http://www.springframework.org/schema/context"
       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">
    <!--  开启注解扫描  -->
    <xontext:component-scan base-package="cn.lc"/>
    <!--  配置 试视图解析器用来识别controller返回对象,也就是跳转到对应jsp   id随便定义-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--    prefix:表示文件所在的目录    suffi表示文件的后缀名-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


    <!--  开启springmvc框架注解的支持  配置conversion-service="conversionService"是为了让自定义的类型转换器生效-->
    <mvc:annotation-driven />

</beans>

4.写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>
  <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>
    <!--/ 表示你发任何请求都会经过这个servlet-->
    <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>

5.在webapp/WEB-INF/pages下创建一个success.jsp(用来测试环境)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>执行成功</h3>
</body>
</html>

6.在webapp直接创建index.jsp(项目生成自带,建议删除出现创建一个)和response.jsp

a:index.jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>返回String</h3>
</body>
</html>

b:response.jsp代码如下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<a href="user/testString">testString</a>

</body>
</html>

<a href="user/testString">这个路径和下面UserController 类中的路径要保持一致

7.在jav中创建一个UserController(包名随便写)类我写的是cn.lc.controller包

package cn.lc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/testString")
public String testString(){
    System.out.println("这个方法执行了。。。");
    return "success";
}
}

运行服务器,结果如下
在这里插入图片描述

在这里插入图片描述

idea控制台输出结果为
在这里插入图片描述

接下来我们讲以下返回值分类(如果三大框架整合到一起就不用这么麻烦了)
1.返回一个字符串

a:创建一个包cn.lc.domain.User实体类(包名可以自己定义)

package cn.lc.domain;

import java.io.Serializable;

public class User implements Serializable {
    private String username;
    private String password;
    private Integer age;

    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 Integer getAge() {
        return age;
    }

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

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

b:修改UserController代码

package cn.lc.controller;

import cn.lc.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/testString")
public String testString(Model model){
    System.out.println("这个方法执行了。。。");
    //模拟从数据库中查询出user对象
        User user = new User();
        user.setUsername("美美");
        user.setAge(20);
        user.setPassword("123");
        //model对象
        model.addAttribute("user",user);
    return "success";
}
}

c:修改success.jsp(跟之前不一样的是加了一段isELIgnored="false"代码)

<%@ page contentType="text/html;charset=UTF-8" language="java"  isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>执行成功</h3>
${user.username}
${user.password}
</body>
</html>

启动服务器
在这里插入图片描述

在这里插入图片描述

返回值是void

a:修改response.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<a href="user/testString">testString</a>
<br/>
<a href="user/testvoid">testVoid</a>

</body>
</html>

b:在UserController中添加一个testvoid方法

/*
返回值类型是void
请求转发一次请求,不用写项目的名称
 */
@RequestMapping("/testvoid")
public void testvoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
    System.out.println("testvoid这个方法执行了。。。");
    //编写转发程序
    request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
    return;
}

解析:因为返回值是void所以系统会默认有一个返回地址,所以正常启动服务器如图
在这里插入图片描述
所以我们就需要添加一个编写转发程序上面代码所示

idea运行结果为
在这里插入图片描述
void返回值还有几个小方法,我只写代码就不一一启动了,有兴趣的可以尝试一下

/*
返回值类型是void
请求转发一次请求,不用写项目的名称
 */
@RequestMapping("/testvoid")
public void testvoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
    System.out.println("testvoid这个方法执行了。。。");
    //编写转发程序
   // request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
    //重定向方法(转发不可以直接写以上路径)
    //response.sendRedirect(request.getContextPath()+"/index.jsp");
    //设置中文乱码
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    //直接会进行响应
    response.getWriter().print("你好");
    return;
}
ResponseBody响应json数据

首先我们得进行环境配置

在webapp下面创建一个js文件,并且在里面引入js

在这里插入图片描述
下载地址在最上面(链接: https://pan.baidu.com/s/1bV0RbnkB0ww2karAquwh2A 提取码: funa)

1.配置springmvc.xml在里面修改如下代码

<?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"
       xmlns:xontext="http://www.springframework.org/schema/context"
       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">
    <!--  开启注解扫描  -->
    <xontext:component-scan base-package="cn.lc"/>
    <!--  配置 试视图解析器用来识别controller返回对象,也就是跳转到对应jsp   id随便定义-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--    prefix:表示文件所在的目录    suffi表示文件的后缀名-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
<!--  前端控制器那些静态资源不拦截  location="/js/**"/>表示js文件里面下面所有的内容都不拦截-->
    <mvc:resources location="/css/" mapping="/css/**"/>  <!-- 样式 -->
    <mvc:resources location="/images/" mapping="/images/**"/>  <!-- 图片 -->
    <mvc:resources location="/js/" mapping="/js/**"/>  <!-- javascript -->


    <!--  开启springmvc框架注解的支持  配置conversion-service="conversionService"是为了让自定义的类型转换器生效-->
    <mvc:annotation-driven />

</beans>

2.修改response.jsp中的代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery.min.js"></script>
    <script>
        //页面加载单机绑定事件
        $(function () {
        $("#btn").click(function () {
    alert("hello");
        });
        });
    </script>
</head>
<body>
<a href="user/testString">testString</a>
<br/>
<a href="user/testvoid">testVoid</a>
<br/>
<button id="btn">发送的ajax的请求</button>

</body>
</html>

启动服务器
在这里插入图片描述

使用@RequestBody注解把json的字符串转换成JavaBean的对象

1.json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包,在pom包里导入

<dependency> 
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId> 
           <version>2.9.0</version>        
</dependency>
<dependency>            
    <groupId>com.fasterxml.jackson.core</groupId>            
    <artifactId>jackson-core</artifactId>            
    <version>2.9.0</version>       
</dependency>
<dependency>            
    <groupId>com.fasterxml.jackson.core</groupId>            
    <artifactId>jackson-annotations</artifactId>           
    <version>2.9.0</version>        
</dependency>

2.修改response.jsp的代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery-3.5.1.min.js"></script>
    <script>
        //页面加载单机绑定事件
        $(function () {
            $("#btn").click(function () {
        $.ajax({
            //编写json格式,设置属性和值
            url:"user/testAjax",
            contentType:"application/json;charset=UTF-8",
            data:'{"username":"hehe","password":"123","age":30}',
            dataType:"json",
            type:"post",
            success:function (data) {
                //data服务器端响应的json数据
                alert(data);
                alert(data.username);
                alert(data.age);
                alert(data.password);



            }
        });
        });
        });
    </script>
</head>
<body>
<a href="user/testString">testString</a>
<br/>
<a href="user/testvoid">testVoid</a>
<br/>
<button id="btn">发送的ajax的请求</button>
<br/>
<a href="user/testModelAndView">testModelAndView</a>

</body>
</html>

3.在UserController增加一个testAjax方法

 @RequestMapping("/testAjax")
    @ResponseBody
    public User testAjax(@RequestBody User user){
        System.out.println("testAjax的方法执行了");
        //客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
        System.out.println(user);
        //做响应,模拟假装去查询数据库
        user.setUsername("haha");
        user.setAge(40);
        //做响应
        return user;
    }

启动服务器点击按钮
在这里插入图片描述idea编译器显示结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值