目录
二、SpringMVC部署(如何在项目中添加SpringMVC)
2、在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)(2和3都是在webapp下创建)
@pathvariable():可以用来映射URL中的占位符到目标方法的参数中
@responseBody():将java对象转为json格式的数据。
一、SpringMVC介绍
1、spring定义:
Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。spring是业务层框架,而Hibernate和Mybatis是持久层框架。
业务层:
采用事务脚本模式。将一个业务中所有的操作封装成一个方法,同时保证方法中所有的数据库更新操作,即保证同时成功或同时失败。避免部分成功部分失败引起的数据混乱操作。
持久层:
采用DAO模式,建立实体类和数据库表映射(ORM映射)。也就是哪个类对应哪个表,哪个属性对应哪个列。持久层的目的就是,完成对象数据和关系数据的转换。
表现层:
采用MVC模式。
M称为模型,也就是实体类。用于数据的封装和数据的传输。
V为视图,也就是GUI组件,用于数据的展示。
C为控制,也就是事件,用于流程的控制。
2、为什么要使用springMVC框架
很多应用程序的问题在于处理业务数据的对象和显示业务数据的视图之间存在紧密耦合,通常,更新业务对象的命令都是从视图本身发起的,使视图对任何业务对象更改都有高度敏感性。而且,当多个视图依赖于同一个业务对象时是没有灵活性的。
SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化我们日常Web开发。
3、springMVC核心开发步骤
3.1 DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC
3.2 HandlerMapping的配置,从而将请求映射到处理器
3.3 HandlerAdapter的配置,从而支持多种类型的处理器
3.4 处理器(页面控制器)的配置,从而刊行功能处理
3.5 ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术
4、struts和springMVC的对比
1、struts配置的是过滤器材,而springMVC配置的是servlet
2、springMVC只需要配置一次,而struts每进行一次配置都要配置,在struts-sy.xml中
3、针对结果集的处理,struts需要配置,而springMVC不需要配置
5、 SpringMVC的组件
5.1 前端控制器(DispatcherServlet)
5.2 请求到处理器映射(HandlerMapping)
5.3 处理器适配器(HandlerAdapter)
5.4 视图解析器(ViewResolver)
5.5 处理器或页面控制器(Controller)
5.6 验证器(Validator)
5.6 命令对象(Command 请求参数绑定到的对象就叫命令对象)
5.7 表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象)
二、SpringMVC部署(如何在项目中添加SpringMVC)
1、添加相关依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
在配置过程会出现一个错误,如下图所示:
问题所在:没有将jstl依赖配置上去
解决方法:
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
2、在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)(2和3都是在webapp下创建)
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 通过context:component-scan元素扫描指定包下的控制器-->
<!--1) 扫描com.javaxl.zf及子子孙孙包下的控制器(扫描范围过大,耗时)-->
<aop:aspectj-autoproxy/>
<context:component-scan base-package="com.javaxl.ssm"/>
<!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
<!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--3) ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4) 单独处理图片、样式、js等资源 -->
<!--<mvc:resources location="/css/" mapping="/css/**"/>-->
<mvc:resources location="/images/" mapping="/images/**"/>
<!--<mvc:resources location="/js/" mapping="/js/**"/>-->
</beans>
3、修改web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 读取Spring上下文的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--web.xml 3.0的新特性,是否支持异步-->
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4、第一个springMVC程序:HelloWorld
HelloController:
package com.zj.www.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
hello.jsp:
<%--
Created by IntelliJ IDEA.
User: T440s
Date: 2021/12/17
Time: 17:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
欢迎来到德莱联盟
</body>
</html>
运行结果:
三、SpringMVC工作流程
我将用一张图片来带大家理解SpringMVC工作流程 ![](https://i-blog.csdnimg.cn/blog_migrate/b80a7671f62ef0c0ff2a7c85089f60bb.png)
文字描述工作流程:
2.1 首先用户发送请求-->DispatherServlet(将用户发送的请求截取后面的请求)
2.2 DispatcherServlet-->HandlerMapping(将请求发送到处理器映射)
2.3 DispatcherServlet-->HandlerAdapter(处理器适配器找到对应的方法)
2.4 HandlerAdapter-->处理器功能处理方法的调用
2.5 ModelAndView的逻辑视图名-->ViewRecolver(找到视图)
2.6 View-->渲染
2.7 返回控制权给DispatcherServlet,由DispatcherServlet返回呼应给用户,流程结束
四、常用注解及结果集的处理
1、常用注解:
@controller:用来定义控制层的组件
当浏览器访问时,就可以访问到此页面的内容了,如果没有加此注解,就访问不到
@requestMapping("/hello")
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
当浏览器访问的内容是http://localhost:8080/hello,以/hello为父路径可以访问到hello这个组件
@responseMapper("/hello")
@pathvariable():可以用来映射URL中的占位符到目标方法的参数中
其中:bid是为一个参数,是一个书籍id
@RequestMapping("/del/{bid}")
public String del(@PathVariable(value = "bid") Integer bid){
this.bookService.deleteByPrimaryKey(bid);
return "redirect:/book/list";
}
@responseBody():将java对象转为json格式的数据。
注意:在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
2、springMVC针对于结果的处理,一共有四种方式:
2.1转发页面(之前在自定义mvc中就是使用这种)
2.2重定向页面
2.3转发子控制器
return "forward:/book/list";
2.4重定向子控制器
return "redirect:/book/list";
3、用CRUD来解释springMVC针对于结果的处理:
先建一个BookController:
package com.zj.www.controller; import com.zj.www.model.Book; import com.zj.www.service.BookService; import com.zj.www.util.PageBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; @Controller @RequestMapping("/book") public class BookController { @Autowired private BookService bookService; @RequestMapping("/preSave") public String preSave(Book book, HttpServletRequest request){ if(book.getBid() != null){ Book b = this.bookService.selectByPrimaryKey(book.getBid()); request.setAttribute("book2",b); } return "bookEdit"; } @RequestMapping("/add") public String add(Book book){ this.bookService.insert(book); return "redirect:/book/list"; } @RequestMapping("/del/{bid}") public String del(@PathVariable(value = "bid") Integer bid){ this.bookService.deleteByPrimaryKey(bid); return "redirect:/book/list"; } @RequestMapping("/list") public String list(HttpServletRequest request,Book book){ PageBean pageBean = new PageBean(); pageBean.setRequest(request); Map map = new HashMap(); map.put("bname","%圣墟%"); List<Map> list = this.bookService.listPager(map, pageBean); request.setAttribute("bookList",list); request.setAttribute("pageBean",pageBean); return "bookList"; } @RequestMapping("/edit") public String edit(Book book){ this.bookService.updateByPrimaryKeySelective(book); return "redirect:/book/list"; } }
BookEdit.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> function doSubmit(bid){ var bookForm = document.getElementById("bookForm"); if(bid){ //修改时候执行 bookForm.action = '${pageContext.request.contextPath}/book/edit'; <%--bookForm.action = '${pageContext.request.contextPath}/bookAction.action?methodName=edit';--%> }else{ //新增时候执行 bookForm.action = '${pageContext.request.contextPath}/book/add'; } bookForm.submit(); } </script> </head> <body> <form id="bookForm" action="" method="post"> bid:<input type="text" name="bid" value="${book2.bid }"><br> bname:<input type="text" name="bname" value="${book2.bname }"><br> price:<input type="text" name="price" value="${book2.price }"><br> <input type="submit" value="提交" οnclick="doSubmit('${book2.bid }');"><br> </form> </body> </html>
BookList.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%--<%@ taglib uri="/zking" prefix="z" %>--%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function add(){
// window.location.href = "bookEdit.jsp";
window.location.href="${pageContext.request.contextPath}/book/preSave";
}function update(bid){
window.location.href = "${pageContext.request.contextPath}/book/preSave?bid="+bid;<%--window.location.href = "${pageContext.request.contextPath}/bookAction.action?methodName=edit&&bid="+bid;--%>
}function del(bid){
window.location.href = "${pageContext.request.contextPath}/book/del/"+bid;<%--window.location.href = "${pageContext.request.contextPath}/bookAction.action?methodName=del&&bid="+bid;--%>
}
</script>
</head>
<body>
<form action="${pageContext.request.contextPath}/book/list
method="post">
书名:<input type="text" name="bname"> <input type="submit"
value="确定">
</form>
<button οnclick="add();">新增</button>
<table border="1" width="100%">
<tr>
<td>编号</td>
<td>名称</td>
<td>价格</td>
<td>操作</td>
</tr>
<c:forEach items="${bookList }" var="b">
<tr>
<td>${b.bid }</td>
<td>${b.bname }</td>
<td>${b.price }</td>
<td>
<button οnclick="update(${b.bid });">修改</button>
<button οnclick="del(${b.bid });">删除</button>
</td>
</tr>
</c:forEach>
</table>
<%--<z:page pageBean="${pageBean }"></z:page>--%>
</body>
</html>
注意里面的写法:
增删改查都是先要跳一个编辑界面,(区别:增加可以不用带id,而修改要带id)
增加: window.location.href="${pageContext.request.contextPath}/book/preSave"; 修改: window.location.href = "${pageContext.request.contextPath}/book/preSave?bid="+bid;
运行结果:
增删改查结果测试成功,重点是要注意其中的跳转方式和跳转逻辑。
五、静态资源的处理
静态处理就是将static目录下的css、js、以及image文件进行处理,之后就可以直接访问目录就可以访问到
没有在spring-mvc.xml中加入以下语句是访问不到static目录下的文件
<mvc:resources location="/static/" mapping="/static/**"/>
加了之后就可以进行访问了
今天的知识就分享到这了,希望能够帮助到你!