springMVC和MVC
MVC是一种框架模式、一种复合模式;采用模型、视图、控制器,把数据的输入、处理、输出分离。
MVC通过将M(Model)和V(View)的代码分离,实现了前后端的代码分离,使项目开发的分工更加明确,程序的测试更加简便,提高了开发效率。
springMVC属于MVC框架模式中的一种,以前端控制器DispatcherServlet为中心。
springMVC执行流程
- 前端控制器接受到用户发出的请求
- 前端控制器去请求处理器映射器,处理器映射器根据url找到对应的处理器,返回一个处理器对象
- 前端控制器拿到处理器对象,去找处理器适配器适配对应的处理器
- 处理器处理完业务后返回一个modelandview
- 前端控制器拿到modelandview后,去找视图解析器解析,把逻辑视图解析为物理视图后返回给前端控制器
- 前端控制器找到对应的视图,渲染视图(把模型中的数据填充到视图里),得到响应结果
- 前端控制器把结果响应给用户
配置文件
1.配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
<display-name>Archetype Created Web Application</display-name>
<!--编码过滤器-解决提交数据的中文乱码问题-->
<filter>
<filter-name>encodingFilter</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>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置前端控制器(DispatcherServlet)-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--绑定springMVC的配置文件-->
<init-parma>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-parma>
<!--启动级别:1。和服务器一起启动-->
<load-on-startup>1</load-on-startup>
</servlet>
<servler-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<urlpattern>/</urlpattern>
</servler-mapping>
说明:/ 只会匹配所有请求,不会匹配jsp页面;/* 匹配所有请求和jsp页面
<!-- spring监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>
2.配置springMVC.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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--开启注解驱动-->
<mvc:annotation-driven/>
<!--静态资源过滤-->
<mvc:default-servlet-handler/>
<!--开启组件扫描.扫描包-->
<context:component-scan base-package="com.kk.controller"/>
<!-- 视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
@RequestMapping
- 把url请求映射到控制器类,或者映射到处理方法
- 可用于类或方法上面,用于类上表示所有响应请求的方法都是以该地址作为父路径
RestFul风格
概述
RestFul是一个资源定位和资源操作的风格。不是标准也不是协议,只是一种风格。可以让设计的软件更简洁、更有层次、易于实现缓存等机制。
功能
- 互联网的所有事物都可以被抽象为资源
- 资源操作:使用get、post、put、delete对资源进行操作
- 分别对应: 查询、 添加、修改、删除
传统方式操作资源:通过不同的参数来实现不同的效果,方法单一,get 和 post
使用RestFul操作资源:通过不同的请求来实现不同的效果,请求地址一样但是可以实现不同的功能(url可以复用)
- https://www.cnblogs.com/qqkkOvO/
- https://www.cnblogs.com/qq/1/ 添加,post
- https://www.cnblogs.com/qq/1/ 更新,put
- https://www.cnblogs.com/qq/1/aa
@PathVariable
- 把方法参数的值绑定到url模板变量上
转发和重定向
实现页面跳转到两种方式
forward:
- 只有一次请求,由服务器进行的页面跳转
- 地址栏不发生改变
redirect:
- 有两次请求,由浏览器进行的页面跳转
- 地址栏发生改变
访问数据库,增删改用重定向,查询用转发。
拦截器与过滤器
拦截器是springMVC的,类似于servlet开发中的Filter,用于对处理器进行预处理和后处理,开发者可以自定义拦截器来实现一些功能。
过滤器:
- servlet规范中的一部分,任何java web工程都可以使用
- 在url-pattern中配置了/*后,会拦截所有访问的资源
拦截器:
- springmvc独有的,只有springmvc工程能使用
- 拦截器只会拦截访问的控制器方法,不会拦截jsp/ html/ css/ image/ js/
自定义拦截器:必须实现HandlerInterceptor接口
<!--编写一个拦截器类-->
clss DIYInterceptor{
//return true 执行下一个拦截器
//return false 不执行下一个拦截器
preHandler(); //请求方法之前执行
postHandler(); //请求方法之后执行
afterHandler(); //
}
<mvc:interceptors>
<mvc:mapping path="/**"/> //拦截包括这个请求下的所有方法
<!-- 多个拦截器会按照顺序执行 -->
<bean class="com.test.interceptor.DIYInterceptor"/>
</mvc:interceptors>
文件上传
前端
<form action="${pageContext.request.contextPath}/fileupload/upload" enctype="multipart/form-data" method="post">
<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
后台
@Controller
@RequestMapping(value = "/fileupload")
public class FileUploadController {
// 上传页面
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {
// 判断文件是否为空
if (file.isEmpty()) {
return "failed";
}
// 获取文件存储路径(绝对路径)
String path = request.getServletContext().getRealPath("/WEB-INF/file");
System.out.println(path);
// 获取文件名称
String fileName = file.getOriginalFilename();
// 创建文件实例
File f = new File(path, fileName);
// 判断文件目录是否存在
if (!f.getParentFile().exists()) {
// 创建目录
f.getParentFile().mkdirs();
System.out.println("文件已创建");
}
// 写入文件
file.transferTo(f);
return "filesuccess";
}
@RequestMapping(value = "/uploadPage")
public String upload() {
return "fileupload";
}
springMVC.xml
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件的最大大小,单位为字节 -->
<property name="maxUploadSize" value="17367648787"></property>
<!-- 上传文件的编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>