springmvc注解式开发
什么是SpringMVC
是一个用来简化基于MVC架构的web应用程序开发的应用开发框架。
注:SpringMVC是Spring框架的一部分
MVC (Model 模型 View 视图 Controller 控制器)
什么是MVC
是一种软件架构思想,可以将软件划分成三种不同类型的模块,分别
是模型,视图和控制器。
模型用于封装业务逻辑的处理,视图用于数据展现和操作界面,
控制器用于协调模型和视图(视图将请求发送给控制器,由控制器选择
对应的模型来处理;模型将处理结果交给控制器,由控制器选择合适的
视图来展现处理结果)。
如何使用MVC
优点
方便代码的维护(修改模型不影响视图,反之也是如此)
方便分工协作
五大组件
- DispatcherServlet 前端控制器
- HandlerMapping 映射处理器
- Controller 处理器
- ModelAndView 模型和视图
- ViewResolver 视图解析器
注解式开发(企业中使用较多)
步骤:
1. 导包 (spring-webmvc)
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.company</groupId>
<artifactId>TestDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<!-- junit:单元测试 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring-webmvc -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- 数据库连接池 -->
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!--mysql -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!-- servlet的jar包依赖, <scope>provided</scope> 表示编译时有效,不会打包发布到Tomcat中 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- jsp的jar包依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- jstl表达式 -->
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<!-- 添加tomcat插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<hostName>localhost</hostName>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 添加Spring配置文件。
<?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"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- 配置组件扫描 -->
<context:component-scan
base-package="controller"/>
<!-- 配置MVC注解扫描 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 静态资源的加载 -->
<mvc:resources location="/" mapping="/**"/>
</beans>
3. 配置DispatcherServlet
(需要指定初始化参数(因为DispatcherServlet的初始化,方法会启动Spring容器,所以,需要知道Spring配置文件的位置)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>TestDemo</display-name>
<!-- 前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<!-- 初始化方法会启动spring容器-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--springmvc配置文件的位置 -->
<param-value>classpath:annotation.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.写Controller
- 不再需要实现Controller接口
- 方法名不作要求,返回类型可以是ModelAndView,也可以是String
- 可以有多个方法
- 在Controller类前添加@Controller,该注解用于组件扫描。
- 使用@RequestMapping来代替HandlerMapping的配置,该注解可以添加到类前面以及方法前面
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
//返回视图名
return "hello";
}
}
5.写jsp
<%@ page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>Hello,SpringMVC!</h1>
</body>
</html>
页面访问地址:
http://localhost:8080/TestDemo/hello
读取请求参数值
通过request
1、编写jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>计算bmi指数</title>
</head>
<body>
<form action="sendBmi" method="post">
<fieldset>
<legend>计算bmi指数</legend>
身高(米):<input name="height" /><br />
体重(公斤):<input name="weight" /><br />
<input type="submit" value="确定" />
</fieldset>
</form>
</body>
</html>
<%@ page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h3>bmi指数为:${bmi }</h3>
<h3>${status }</h3>
</body>
</html>
2、编写Controller
package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
//返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
/*
* DispatcherServlet利用java反射分析处理器的
* 方法签名(方法名,参数类型,返回类型),然后
* 将需要的对象作为参数传进来。
* 比如,这儿,需要有一个request对象,
* DispatcherServlet就会将request作为参数传进来。
*/
@RequestMapping("/sendBmi")
public String sendBmi(HttpServletRequest request,Model model) {
double height=Double.parseDouble(request.getParameter("height"));
double weight=Double.parseDouble(request.getParameter("weight"));
double bmi=weight/height/height;
String status="正常";
if(bmi < 19){
status = "过轻";
}
if(bmi > 25){
status = "过重";
}
model.addAttribute("bmi",bmi);
model.addAttribute("status",status);
return "view";
}
}
3、页面访问
通过@RequestParam
1、修改Controller
package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
//返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
/*
*
* DispatcherServlet利用java反射分析方法的签名,
* 会将参数值获得之后,赋给对应的形参。
* 注:
* 可以使用@RequestParam注解告诉DispatcherServlet,
* 形参名与请求参数名的对应关系。
*/
@RequestMapping("/sendBmi")
public String sendBmi(@RequestParam(value = "height")String height,@RequestParam(value = "weight")String weight,Model model) {
double height1=Double.parseDouble(height);
double weight1=Double.parseDouble(weight);
double bmi=weight1/height1/height1;
String status="正常";
if(bmi < 19){
status = "过轻";
}
if(bmi > 25){
status = "过重";
}
model.addAttribute("bmi",bmi);
model.addAttribute("status",status);
return "view";
}
}
2、重新页面访问
通过javabean
1、创建javabean
package javabean;
public class BmiParam {
private double height;
private double weight;
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
2、创建Controller
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javabean.BmiParam;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
// 返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
/*
* DispatcherServlet通过反射分析方法的签名,
* 会将BmiPraram对象创建好之后传进来。
* 注:
* 会读取相应的请求参数值,并且,会做类型转换。
*/
@RequestMapping("/sendBmi")
public String sendBmi(BmiParam bp, Model model) {
double height = bp.getHeight();
double weight = bp.getWeight();
double bmi = weight / height / height;
String status = "正常";
if (bmi < 19) {
status = "过轻";
}
if (bmi > 25) {
status = "过重";
}
model.addAttribute("bmi", bmi);
model.addAttribute("status", status);
return "view";
}
}
3、页面访问
向页面传值
绑订数据到request
1、修改Controller
package controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javabean.BmiParam;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
// 返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
@RequestMapping("/sendBmi")
public String sendBmi(BmiParam bp, HttpServletRequest request) {
double height = bp.getHeight();
double weight = bp.getWeight();
double bmi = weight / height / height;
String status = "正常";
if (bmi < 19) {
status = "过轻";
}
if (bmi > 25) {
status = "过重";
}
request.setAttribute("bmi", bmi);
request.setAttribute("status", status);
return "view";
}
}
2、页面访问
返回ModelAndView
1、修改Controller
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javabean.BmiParam;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
// 返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
@RequestMapping("/sendBmi")
public ModelAndView sendBmi(BmiParam bp) {
double height = bp.getHeight();
double weight = bp.getWeight();
double bmi = weight / height / height;
String status = "正常";
if (bmi < 19) {
status = "过轻";
}
if (bmi > 25) {
status = "过重";
}
ModelAndView mav=new ModelAndView("view");
mav.addObject("bmi", bmi);
mav.addObject("status", status);
return mav;
}
}
2、页面访问
绑订数据到ModelMap
1、修改Controller
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import javabean.BmiParam;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
// 返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
@RequestMapping("/sendBmi")
public String sendBmi(BmiParam bp,ModelMap mp) {
double height = bp.getHeight();
double weight = bp.getWeight();
double bmi = weight / height / height;
String status = "正常";
if (bmi < 19) {
status = "过轻";
}
if (bmi > 25) {
status = "过重";
}
ModelAndView mav=new ModelAndView("view");
mp.addAttribute("bmi", bmi);
mp.addAttribute("status", status);
return "view";
}
}
2、页面访问
绑订数据到session
1、修改Controller
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javabean.BmiParam;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
// 返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
@RequestMapping("/sendBmi")
public String sendBmi(BmiParam bp, HttpSession session) {
double height = bp.getHeight();
double weight = bp.getWeight();
double bmi = weight / height / height;
String status = "正常";
if (bmi < 19) {
status = "过轻";
}
if (bmi > 25) {
status = "过重";
}
session.setAttribute("bmi", bmi);
session.setAttribute("status", status);
return "view";
}
}
2、页面访问
重定向
方法的返回值是String
return “redirect:hello”
1、修改Controller
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javabean.BmiParam;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
// 返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
@RequestMapping("/sendBmi")
public String sendBmi(BmiParam bp, HttpSession session) {
double height = bp.getHeight();
double weight = bp.getWeight();
double bmi = weight / height / height;
String status = "正常";
if (bmi < 19) {
status = "过轻";
}
if (bmi > 25) {
status = "过重";
}
session.setAttribute("bmi", bmi);
session.setAttribute("status", status);
return "redirect:hello";
}
}
2、页面访问
方法的返回值是ModelAndView
RedirectView rv =
new RedirectView(“toIndex.do”);
ModelAndView mav =
new ModelAndView(rv);
return mav;
1、修改Controller
package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;
import javabean.BmiParam;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
// 返回视图名
return "hello";
}
@RequestMapping("/bmi")
public String bmi() {
return "bmi";
}
@RequestMapping("/sendBmi")
public ModelAndView sendBmi(BmiParam bp, HttpSession session) {
double height = bp.getHeight();
double weight = bp.getWeight();
double bmi = weight / height / height;
String status = "正常";
if (bmi < 19) {
status = "过轻";
}
if (bmi > 25) {
status = "过重";
}
session.setAttribute("bmi", bmi);
session.setAttribute("status", status);
RedirectView rv=new RedirectView("hello");
ModelAndView mav=new ModelAndView(rv);
return mav;
}
}
2、页面访问