前言
现在由于功能以及业务的复杂性,大部分系统从技术上就拆分开为前后端分离,单体应用我都很少没接触了,导致现在对springMVC那套都忘记了很多东西,因此这篇文章在来回忆一下SpringMVC这个框架;很多时候因为业务的需求,本地功能不是很大,以后扩展性也不多,主要访问就几个业务员或者技术维护系统,就考虑单体应用,并不需要复杂,怎么简单怎么来就行,快速开发一套系统。
MVC模式
MVC(Model-View-Controller)模式是一种常用的软件架构模式,用于分离应用程序的业务逻辑、用户界面和数据模型。
在MVC模式中,应用程序被分为三个核心部分:
-
模型(Model):负责处理应用程序的数据逻辑,包括数据的读取、写入、更新和删除。模型通常是应用程序中的数据对象或数据库的接口。
-
视图(View):负责显示应用程序的用户界面,包括各种UI元素和用户交互。视图是应用程序中用户可以看到和操作的部分。
-
控制器(Controller):负责处理用户输入和整个应用程序的控制流程。控制器接收用户输入并调用模型或视图来响应用户操作。它将用户输入转化为对模型的操作,然后更新视图以反映新的状态。
MVC模式的优点包括:
-
分离关注点:MVC模式允许开发人员将应用程序的不同部分分开开发,使得代码更易于理解和维护。
-
可重用性:由于模型、视图和控制器之间的分离,可以更容易地重用这些组件,以构建不同的应用程序或模块。
-
可测试性:由于模型、视图和控制器的独立性,可以更容易地编写和运行单元测试,以确保每个组件的正确性。
MVC模式可以应用于各种各样的应用程序,包括Web应用程序、桌面应用程序和移动应用程序等。
对于MVC模式,业务开发人员主要精力,或者说业务操作,主要放在控制器上操作,或者说专注于控制器就行。
SpringMVC框架
mybatis ---解决java代码和sql语句之间的耦合---代替DAO层
Spring ---解决了业务层和其他各层之间的耦合---优化Service层
SpringMVC---解决了java代码和servlet之间的耦合---代替servlet(SpringMVC本质还是Servlet,实现了对Servlet解耦)
我们在使用servlet初期的时候发现,每一个请求都对应一个servlet ,如果有100个请求,这个时候就需要写100个servlet,这样一来就 会造成servlet的数量太多,尽管后期进行了Servlet合并,但是任然是手动进行的,耦合度太高了。
使用servlet进行数据接受的时候,比较的麻烦
并且springMVC是基于spring 开发的,这个完整的生态链,以及扩展性,促使我们不得不用springMVC.强大的拦截器,aop 对象的生命周期,我们确实用这个框架用的很爽的感觉
1.Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。
SpringMVC和Spring关系
1.SpringMVC是Spring framework的子框架.
2.SpringMVC运行后形成自己的容器.Spring也有自己的容器. 2.1 称Spring的容器和SpringMVC的容器是父子容器
3.SpringMVC就是比直接使用Spring多了spring-webmvc-xxx.jar
4.在环境搭建时,区分开父子容器. 4.1 直观表现:Spring和SpringMVC的内容可以配置在一个配置文件中.区分不开父子容器.可能导致出现问题:例如声明式事务绑定无 效(不报错,还没有效果.) 4.2 处理办法:Spring的东西配置一个配置文件中,SpringMVC的东西配在一个文件中.
2.Spring MVC是一个基于MVC的web框架,Spring MVC分离了控制器,模型对象,过滤器以及处理程序对象的角色,这种分离让他们更 容易进行定制。
3.Spring MVC 3.0 后全面超越Struts2,成为最优秀的MVC框架
2.Spring MVC通过一套MVC注解,让POJO成为处理请求的控制器,而无须实现任何接口
4.采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性
5.进行更简洁的Web层的开发
6.天生与Spring框架集成(如:IOC容器,AOP等)
7.能简单的进行web层的单元测试
8.支持灵活的URL到页面控制器的映射
9.非常容易与其他试图技术集成,
执行流程
流程描述
当用户发起请求后,执行DiapacherServlet,如果是JSP直接调用jsp页面.如果不是JSP,DiapacherServlet调用HandlerMapping判断请求URL是否合法,如果URL不存在报错,如果URL存在使用HandlerAdapter调用具体的HandlerMethod,当Handler执行完成后会返回ModelAndView,会被ViewResovler解析,调用具体的物理视图. 最终响应给客户端浏览器.
SpringMVC环境搭建
创建maven web项目
1.New Project 点击Maven 先勾选Create from archetype 选择org.apache.maven.archetypes:maven-archetype-webapp
2.设置项目名称
3.创建完成后,手动添加resources和java目录
添加依赖
<dependencies>
<!--进行junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--Spring的5大核心jar包 -->
<!--依赖于commons-logging日志管理 -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--提供了框架的基本组成部分,包括IOC 和 DI-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!-- 提供了BeanFactory-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--上下文配置对象,提供一个框架式的对象访问方式-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--提供了强大的表达式语言-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--springMVC的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--java web依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</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>
</dependencies>
web.xml
<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>
<!--设置欢迎页 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--配置前端控制器,拦截的是以do结尾的url -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 自启动-在启动tomcat时立即加载对应的Servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
创建Spring核心配置文件
1.在WEB-INF下
2.新建名字叫:<servlet-name>-servlet.xml配置文件,并配置内容
==说明:<servlet-name>-servlet.xml 的意思是:如果web.xml中,<servlet-name>springmvc</servlet-name>那么创建的Spring框架的核心配置文件名就叫做springmvc-servlet.xml。
<?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"
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">
<!-- 设置注解扫描路径 -->
<context:component-scan base-package="com.controller"></context:component-scan>
<!-- 默认加载注解处理器映射器和处理器适配器及很多的参数绑定 -->
<mvc:annotation-driven/>
</beans>
编写控制器
@Controller
public class UserController {
@RequestMapping("/show")
public ModelAndView show(HttpServletRequest request){
ModelAndView mv=new ModelAndView();
String name=request.getParameter("username");
request.setAttribute("uname",name);
mv.setViewName("show.jsp");
return mv;
}
}
创建index.jsp页面
<body>
<form action="reg.do" method="post">
用户名:<input type="text" name="username"><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="提交">
</form>
</body>
九大内置对象和四大作用域
九大内置对象
类型 | 对象名 | 描述 | 获取对象 |
HttpServletRequest | request | 请求对象 | 方法参数 |
HttpServletResponse | response | 响应对象 | 方法参数 |
HttpSession | session | 会话对象 | req.getSession(); |
ServletContext | application | 应用程序对象 | getServletContext() |
PrintWriter | out | 输出对象 | res.getWriter(); |
Exception | out | 异常对象 | |
PageContext | pageContext | 页面上下文对象 | |
ServletConfig | config | 配置对象 | |
Object | page | 当前页面对象 |
输出对象(2):
out , response
作用域对象(4):
pageContext ,request , session , application
打酱油对象(3):
exception , config , page
四大作用域对象
1.九大内置对象中可以在特定情况下传递内容
2.四大作用域对象:
1 application: 整个应用程序任何时间内容
2 session:一次会话 浏览器关闭无效 超过默认tomcat中设置的Session时间 代码手动设置的有效时间 session.setMaxInactiveInterval(123);
3 request:一次请求,只要跳转必须使用转发才能继续传递
4 pageContext : 当前页面内
3.常用方法
1 setAttribute();设置值
2 getAttribute();获取值
3 removeAttribute();删除某个值
4.其他可能使用方法:
1 application.getRealPath(“/”);获取到参数的真实全路径(发布到tomcat后的路径)
2 request.getRequestURL();获取请求路径.
3 request.getPrameter();获取请求参数
4 request.setCharacterEncoding(“utf-8”);设置请求编码
5 response.setContentType(“text/html;charset=utf-8”);设置响应头中响应内容.
映射请求
SpringMVC 使用 @RequestMapping 注解为控制器指定可以处理哪些URL请求
@RequestMapping修饰类
注解@RequestMapping修饰类,提供初步的请求映射信息,相对于WEB应用的跟目录。
如果在类名前,使用了注解@RequestMapping,那么在处理器的方法里,在进行页面跳转的时候:
如果不经过视图解析器,那就要在跳转页面名的前面 加上“ / ”,表示页面的跳转位置从项目根目录开始;
如果没加“ /” 的意思是,以上面的例子来说,那么页面的跳转位置是从items这个逻辑文件夹开始!
@RequestMapping修饰方法
1.@RequestMapping("/show.do")
===加 / 是当前工程下,不加默认也是当前工程下
2.@RequestMapping(value={"show.do",”reg.do“})
===表示两个url请求都可以进入此控制器的此方法里。
===如果value的值只有一个的话,不需要加{}
===如果@RequestMapping注解里只有value这一个属性的话,并且该value属性还只有一个值的话,value也可以省去。如 上面的1。
3.@RequestMapping(value={"show.do",”reg.do“} ,method={RequestMethod.POST})
===value 和method两个属性之间使用 逗号,隔开
===method={RequestMethod.POST} 表示当前方法只能处理POST请求,若缺省,则get/post都可以处理。
4.对请求的参数加以限制:
@RequestMapping(value={"show.do",”reg.do“} ,params={”参数名1“,”参数名2“})
===表示当前方法请求参数中,必须有参数名叫 参数名1 和 参数名2 这两个参数。
@RequestMapping(value={"show.do",”reg.do“} ,params={”参数名1=value1“,”参数名2“})
===表示当前方法请求参数中,必须有参数名叫 参数名1 和 参数名2 这两个参数,并且参数1的值必须为value1。
5.headers属性:作为了解
指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=凤凰网")
===表示仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.ifeng.com/
”的请求;
返回值类型
controller 方法的返回值有三种:
A.ModelAndView
B.String
C.void
拦截器
1.拦截器和 过滤器的区别和联系:
联系:都是在进入目标代码前,提前做一些其他的事情。
区别:过滤器:----依赖于Servlet,在web.xml中进行配置
----函数回调实现的。
拦截器: ----依赖于MVC框架,在ApplicationContext.xml中进行配置
----本质拦截器是反射实现的。
-----过滤器能做的活,拦截器都能完成。----使用拦截器比较多。
执行顺序: 过滤器 拦截器 控制器
public class MYHandler implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("执行完控制器的方法后,执行的拦截器方法。。。。");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("请求已经进入到控制器了,但是还没有执行完控制器的时候,回到拦截器里来,执行该方法。");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("进入控制器方法前,要执行的拦截器方法。。。。。");
//返回值:返回值为true----说明,符合通过条件,可以进行进入到控制器里。
// 返回值为 false----说明:不符合通过条件,拦截此次请求。 不在继续进入控制器。
return false;
}
}
配置拦截器
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!-- /表示项目根目录;** 项目下任意路径以及任意子路径; 拦截所有请求路径 -->
<mvc:exclude-mapping path="/index.do"/> <!-- 放行请求路径 -->
<mvc:exclude-mapping path="/reg.do"/>
<mvc:exclude-mapping path="/login.do"/>
<bean class="com.msb.handler.MYHandler"></bean>
</mvc:interceptor>
</mvc:interceptors>