Spring MVC
springmvc概述
基本说明
sptingmvc基于spring 是spring中的一个模块,做web开发使用的。springmvc叫做spring web mvc
说明他是spring的核心技术 做web springmvc内部使用mvc架构模式
spring mvc 是一个容器 管理对象 使用ioc核心技术 springmvc管理界面层中的控制对象。
springmvc底层也是Servlet,以servlet为核心 接收请求 处理请求 显示处理结果给用户
处理用户的请求
用户发起请求-----springmvc------spring----mybatis----mysql数据库
1.2springmvc中的核心Servlet--DispatcherServlet
DispatcherServlet是框架一个对象,负责接收请求,响应处理结果。
DIspatcherServlet他的父类是HTTPServlet
DispatcherServlet也叫做前端控制器(front controller)
springmvc是管理控制器对象,原来没有springmvc之前使用servlet作为控制器对象使用,现在通过
springmvc容器创建一种叫做控制器的对象,代替servlet行驶控制器的角色,功能。
springmvc 主要使用注解的方式来创建控制对象 ,处理请求
springmvc注解式的开发模式
需求:用户发起一个请求,springmvc接收请求,显示请求的处理结果
servlet的实现方式:
jsp发起-------servlet----jsp显示结果
步骤
1.新建web项目
2.加入web依赖
spring-webmvc依赖(springmvc框架依赖),servlet依赖
3.声明springmvc核心对象DispatcherServlet
1)DispatcherServlet是一个servlet对象
2)DispatcherServlet叫做前端控制器(front controller)
3)DispatcherServlet作用:
1.在servlet的init()方法中,创建springmvc中的容器对象。
webAppliactionContext ctx=new ClassPathXmlApplicationContext("appliationContextxml")
2.作为servlet,接收请求
4.创建一个jsp,发起请求
5创建一个普通类作为控制器使用(代替之前的servlet)
1.)在类上面加入@Controller注解
2.)在类中定义方法,方法上面加入@RequestMapping注解
方法处理请求的,相当于servlet的doGet,dopost
6.创建结果的jsp页面
7.创建springmvc的配置文件(spring的配置文件一样)
1)声明组件扫描器,指定@Controller注解所在的包名
2)声明视图解析器对象
1.3springmvc请求的处理过程
简单处理过程:
用户发起请求some.do----》Tomcat接收请求-----DispatcherServlet----分配MyController(dosome()返回mv对象)----
mv显示给用户
省略Tomcat
用户some.do---------------DispatcherServlet--------------MyController
如果使用Servlet处理请求
用户发起请求------------------没有其他对象----------------Servlet
web开发中配置文件的说明
1.web.xml文件:
部署描述符文件,给服务器(Tomcat)。
作用:服务器在启动的时候要读取web.xml,根据文件的说明去创建各种对象,根据文件中的声明知道请求和Servlet等对象的关系。
2.框架的配置文件,springmvc的配置文件
作用:声明框架创建的项目中的各种对象,主要创建Controller对象的
配置文件加载的顺序和功能
1.Tomcat服务器启动,读取web.xml文件根据web文件中的说明创建对象。
<servlet>
<servlet-name>myweb</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>
<!-- 让服务器Tomcat创建对象的顺序 是个整数值 大于等于0 数值越小,创建对象的时间越早-->
<load-on-startup>1</load-on-startup>
</servlet>
创建DispatcherServlet他的对象,会执行init方法。在init方法中会执行容器对象的创建 WebApplicationContext ctx=new WebApplicationContext(“classpth:springmvc.xml”)
2.springmvc框架,new ClassPathXmlApplicationContext()读取的配置文件。
<context:component-scan base-package="com.bjpowernode.controller"/>
<!-- 视图的解析器:帮助处理视图-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀:指定视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀:视图文件的扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
使用组件扫描器base-package=“com.bjpower.controller”,遍历controller包中的所有类
MyCOntroller类,找到这个类中的@Controller @RequestMapping注解, 就能创建MyController对象
就知道some.do的请求时执行doSome()方法
以上1 2 都是项目的启动过程 没有执行任何的用户请求
3.用户发起请求 some.do 发给中央调度器 some.do------DispatcherServlet
DIspatcherServlet里面有WebApplicationContext。 WebApplicationContext里面的MyCOntroller对象。请求some.do,
DIspatcherServlet就知道是MyController处理的。
springmvc中的MVC组件
第二章springmvc的注解式开发
2.1RequestMapping
属性:value 请求uri地址。
位置:1)方法上面 必须的 2)在类的上面作为模块名称
@RequestMapping(value = {"/some.do", "/frist.do"})
public ModelAndView dosome() {//doGet()
属性:method请求方式,使用RequestMethod类的枚举,表示请求方式
@RequestMapping(value = "/some.do",method=RequestMethod.GET/POST )
public ModelAndView dosome() {//doGet()
请求方式的定义
对数据的添加修改一般用post
查询一般用get(数据不改变)
表单ajax默认是get 地址栏 超链接 src资源路径都是get(能缓存效率高)
请求方式指定
@RequestMapping(value="",mathod=RequestMethod.GET)
2.2接收请求中的参数
对应HTTPServlet,HTTPServletResponse,HTTPSession 只需要在控制器方法的形参列表中,定义就可以了。
框架会给参数赋值,在控制器方法内部可以直接使用request,response session参数。
接收请求中的参数:逐个接收,对象接收
逐个接收
逐个接收:请求中的参数名和控制器中的参数名一样。按照名称对象接收参数
Controller接收参数
接收参数的问题:
1.最好使用包装类型,例如Integer 能接收空值情况 ,接收的是null
2.框架可以使用String 到int long double
3.post请求中乱码的问题,使用字符集过滤器
<!-- 声明过滤器,框架提供的,解决post请求中文乱码-->
<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>
<init-param>
<!--强制请求对象(request)使用encoding的编码方式-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!--强制应答对象(response)使用encoding的编码方式-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<!--强制所有请求,先经过过滤器-->
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
解决中文乱码:CharacterEncodingFilter(过滤器类)
2.2.4对象接收
对象接收:在控制器方法的形参是java对象 使用java对象的属性接收请求中的参数值
需求:java对象的属性名和请求中的参数名一样
具体实现过程
在idea中新新建一个maven项目
File--------->new----->project
选择maven---------->勾选Create from archetype(以模板创建maven项目)
选择maven-archetype-webapp (一定要选择对不要选错了)
然后next 建好名 完成maven的创建
我的项目如图所示
修改pom.xml(因为我们选择的是模板 ,改模板默认jdk是1.7我们需要修改为1.8)
pom.xml中的代码如下 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>ch01-springmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ch01-springmvc 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>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--springmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!-- servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
</project>
由于是模板项目中缺少resources目录我门需要自己创建
在main上右键----------》New--------------》Directory输入rescoures
然后在rescores上右键选择Mark Directory 选择rescoures root(该文件用来放在所有的配置文件)
变成上图的样式证明 成功
在rescoures下创建spring配置文件
右键选择new选择XML-------------》选择spring–Config
改配置文件中的代码为
<?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:context="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/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--springmvc配置文件-->
<!-- 声明组件扫描器-->
<context:component-scan base-package="com.bjpowernode.controller"/>
<!-- 视图的解析器:帮助处理视图-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀:指定视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀:视图文件的扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
web.xml中的代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Archetype Created Web Application</display-name>
<!-- 声明springmvc的核心对象
当我们访问了mymvc后报错 文件没有找到/WEB-INF/springmvc-servlet.xml
Could not open ServletContext resource [/WEB-INF/myweb-servlet.xml]
错误原因:
在servlet的init()方法中要去创建springmvc使用的容器对象WebApplicationContext()
webAppliactionContext ctx=new ClassPathXmlApplicationContext("配置文件")
配置文件的默认路径是/WEB-INF/<servlet-name>-servletxml
-->
<servlet>
<servlet-name>myweb</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>
<!-- 让服务器Tomcat创建对象的顺序 是个整数值 大于等于0 数值越小,创建对象的时间越早-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myweb</servlet-name>
<!--url-pattern吧一些请求交给指定的servlet处理
使用的中央调度器DispatcherServlet
1.使用扩展名的方式,格式*.xxx, xxx是自定义的扩展名。
例如 *.dao *.action *.mvc 不能使用*.jsp
2使用/
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 声明过滤器,框架提供的,解决post请求中文乱码-->
<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>
<init-param>
<!--强制请求对象(request)使用encoding的编码方式-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!--强制应答对象(response)使用encoding的编码方式-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<!--强制所有请求,先经过过滤器-->
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
在java中创建如下的包在包中创建2个类分别是MyController和StudentController
MyController代码如下
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @Controller:创建控制器(处理器)对象 控制器:叫做后端控制器(back Controller)自定义的类处理请求的。
* 位置:在类的上面,表示创建此类的对象,对象放在springmvc的容器中
*/
@Controller
public class MyController {
//定义方法处理请求。public void doGet(){}
/**
* springmvc框架 使用控制器类中的方法处理请求
* 方法的特点
* 1.方法的形参,表示请求中的参数
* 2.方法的返回值,表示本次请求的处理请求
* @return
*/
/**
* @return
* @RequestMapping 请求映射
* 属性:value 请求中的uri地址 唯一值 以“/”开头。
* mathod:请求的方式,使用RequestMethod类的枚举值。
* 例如get方式 RequestMethod.GET
* 位置:1.在方法的上面() 2.在类定义的上面(可选)
* 作用:把指定的请求,交给指定的方法处理 等同于url-pattern
* 返回值ModelAndView:表示本次请求的处理结果(数据和视图)
* Model:表示数据
* View:表示视图
*/
@RequestMapping(value = {"/some.do", "/frist.do"})
public ModelAndView dosome() {//doGet()
//使用这个方法处理请求。能处理请求的方法叫做控制器方法
//调用service对象,处理请求 返回数据
ModelAndView mv = new ModelAndView();
//添加数据
mv.addObject("msg", "处理了some.do请求");
mv.addObject("fun", "执行了dosome方法");
//指定显示数据的视图setViewName("视图完整的路径")
//mv.setViewName("show.jsp");
// mv.setViewName("/WEB-INF/view/show.jsp");
// mv.setViewName("/WEB-INF/view/other.jsp");
//当配置了视图解析器,使用文件名称作为视图名使用,叫做视图逻辑名称
//使用了逻辑名称,框架使用配置文件中的视图解析器的前缀和后缀,拼接完成
// /WEB-INF/view/+show+.jsp
mv.setViewName("show");
//返回结果
return mv;
}
/**
* 当框架调用完dosome方法后得到返回值ModelAndView
* 框架会在后续的处理逻辑值,处理mv对象里面的数据和视图。
* 对数据执行request.setAttribute(“msg”,“处理some.do请求”);把数据放入到request作用越。
* 对视图执行forword转发操作。等同于request.getRequestDispatcher(“/show.jsp”).forword(..)
*/
@RequestMapping(value = {"/other.do", "/test/sencond.do"})
public ModelAndView doOther() {//doGet()
System.out.println("执行了MyCOntroller的doOther方法");
//使用这个方法处理请求。能处理请求的方法叫做控制器方法
//调用service对象,处理请求 返回数据
ModelAndView mv = new ModelAndView();
//添加数据
mv.addObject("msg", "处理了other.do请求");
mv.addObject("fun", "执行了doOther方法");
mv.setViewName("other");
//返回结果
return mv;
}
}
StudentController代码如下
package com.bjpowernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
*
*/
@Controller
public class StudentController {
@RequestMapping("/add.do")
public ModelAndView addStudent(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","注册成功");
mv.setViewName("show");
return mv;
}
}
在WEBapp下创建如图的jsp文件
主jsp文件下的代码
<%--
Created by IntelliJ IDEA.
User: GJX
Date: 2021/9/16
Time: 16:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个springmvc</title>
</head>
<body>
<a href="some.do">发起some.dao的请求</a><br/>
<a href="test/sencond.do">test/sencond.do</a><br/>
<a href="add.do">add.do的请求</a>
</body>
</html>
show.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>show</title>
</head>
<body>
/WEB-INF/view/show.jsp,显示request作用域中的数据<br/>
<h3>msp数据:${msg}</h3>
<h3>fun数据:${fun}</h3>
</body>
</html>
other.jsp代码如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>show</title>
</head>
<body>
/WEB-INF/view/show.jsp,显示request作用域中的数据<br/>
<h3>msp数据:${msg}</h3>
<h3>fun数据:${fun}</h3>
</body>
</html>
配置Tomcat
找到自己电脑上Tomcat安装的位置
点击加号 发布自己的项目
选择这个选择
然后应用然后点击ok发布成功
运行结果如图