springmvc
1、概述
SpringMVC是Spring Framework的一部分,就java实现mvc的轻量web框架
- 轻量
- 高效,基于请求响应
- 与Spring兼容
- 约定优于配置
- 功能强大:Restful,数据验证,格式化,本地化
- 简介灵活
核心:DispatcherServlet
2、Hello SpringMVC
配置方式
2.1、配置
-
新建moudle,添加web支持
-
导入spring-webmvc依赖
-
配置web.xml,注册DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?> <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_4_0.xsd" version="4.0"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联springmvc配置文件--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.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>
-
SpringMVC配置文件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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--处理器映射器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--处理器适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> <bean class="com.moral.controller.HelloController" id="/hello"/> </beans>
2.2、controller,并在springmvc配置文件中注册此controller
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","hellomvc");
modelAndView.setViewName("test");
return modelAndView;
}
}
2.3、问题
404 错误解决:Project Structure --》Aftifacts下该项目WEB-INF下添加lib文件夹,加入所有jar包
注解方式
- 新建web项目
- 导入jar包
- 编写web.xml,注册DispatcherServlet
- 编写springmvc配置文件
- 创建controller
- 完善前端视图和controller之间的对应
springmvc配置三大件:处理器映射器,处理器适配器,视图解析器。
通常我们只需要配置视图解析器,处理器映射器和处理器适配器只需开启注解支持就行
3、注解方式
-
web.xml
<?xml version="1.0" encoding="UTF-8"?> <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_4_0.xsd" version="4.0"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.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>
-
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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--自动扫描包,让指定包下的注解生效,由IOC容器统一管理--> <context:component-scan base-package="com.moral.controller"/> <!--让springmvc不处理静态资源--> <mvc:default-servlet-handler/> <!--注解生效--> <mvc:annotation-driven/> <!-- --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp"/> <property name="suffix" value=".jsp"/> </bean> </beans>
4、Controller和RestFul风格
4.1、实现Controller
- 实现Controller类,它就是一个控制器类
- spring配置文件注册bean
注意:spirngmvc-servlet中自动扫描包,不处理静态资源和注解生效都可以不写,只留视图解析器
4.2、@Controller
- @Controller
- 配置自动扫描包:<context:component-scan base-package="com.moral.controller"/>
5、重定向和转发
5.1、ServletAPI实现转发和重定向,无需视图解析器
//转发
@RequestMapping("/h1")
public void hello1(Model model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
model.addAttribute("msg", "hello springmvc");
request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request, response);
}
//重定向
@RequestMapping("/h2")
public void hello2(Model model, HttpServletRequest request, HttpServletResponse response) throws IOException {
model.addAttribute("msg", "hello springmvc");
response.sendRedirect("/WEB-INF/jsp/hello.jsp");
}
5.2、SpringMVC实现转发和重定向,无需视图解析器
//转发
@RequestMapping("/h3")
public String hello3() {
//方式1
//return "/index.jsp";
//方式2
return "forward:/index.jsp";
}
//重定向
@RequestMapping("/h4")
public String hello4() {
return "redirect:/index.jsp";
}
5.3、配置了视图解析器
//转发
@RequestMapping("/h3")
public String hello3() {
return "index";
}
//重定向
@RequestMapping("/h4")
public String hello4() {
return "redirect:/index.jsp";
}
6、乱码问题
-
controller里,request.setCharacterEncoding("utf-8");
-
过滤器。request.setCharacterEncoding("utf-8");
-
更改请求方式
-
web.xml配置
/:不会匹配*.jsp,只能匹配路径型url
/*:会匹配 *.jsp,匹配任何类型url
<!--配置springmvc乱码过滤--> <filter> <filter-name>encoding</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> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
检查tomcat编码
7、JSON
7.1、jackjson
//jackson ObjectMapper
ObjectMapper mapper = new ObjectMapper()
//创建一个对象
User user = new User("陈平安",3,"男");
String stu = mapper.writeValueAsString(user);
return stu;
7.2、json乱码解决
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
8、拦截器
-
自定义拦截器类。
public class MyInterceptor implements HandlerInterceptor { /* * return true:执行下一个拦截器 * return false:不执行下一个拦截器 * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return false; } }
-
拦截器配置。配置类。或者xml配置
<!--拦截器配置--> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.moral.config.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
9、文件上传下载
前端form entype="multipart/form-data"
-
依赖
<dependencies> <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> </dependencies>
-
配置
<!--文件上传配置--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8"/> <property name="maxUploadSize" value="10485760"/> <!--上传文件大小上限--> <property name="maxInMemorySize" value="40960"/> </bean>
9.1、上传
package com.moral.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
@Controller
public class FileController {
/*
* 方法1:
* */
//@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
//批量上传CommonsMultipartFile则为数组即可
@RequestMapping("/upload")
public String fileUpload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
//获取文件名 : file.getOriginalFilename();
String uploadFileName = file.getOriginalFilename();
//如果文件名为空,直接回到首页!
if ("".equals(uploadFileName)) {
return "redirect:/index.jsp";
}
System.out.println("上传文件名 : " + uploadFileName);
//上传路径保存设置
String path = request.getServletContext().getRealPath("/upload");
//如果路径不存在,创建一个
File realPath = new File(path);
if (!realPath.exists()) {
realPath.mkdir();
}
System.out.println("上传文件保存地址:" + realPath);
InputStream is = file.getInputStream(); //文件输入流
OutputStream os = new FileOutputStream(new File(realPath, uploadFileName)); //文件输出流
//读取写出
int len = 0;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
os.flush();
}
os.close();
is.close();
return "redirect:/index.jsp";
}
/*
* 方法2
* 采用file.Transto 来保存上传的文件
*/
@RequestMapping("/upload2")
public String fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
//上传路径保存设置
String path = request.getServletContext().getRealPath("/upload");
File realPath = new File(path);
if (!realPath.exists()) {
realPath.mkdir();
}
//上传文件地址
System.out.println("上传文件保存地址:" + realPath);
//通过CommonsMultipartFile的方法直接写文件(注意这个时候)
file.transferTo(new File(realPath + "/" + file.getOriginalFilename()));
return "redirect:/index.jsp";
}
}
9.2、下载
/*文件下载*/
@RequestMapping(value="/download")
public String downloads(HttpServletResponse response , HttpServletRequest request) throws Exception{
//要下载的图片地址
String path = request.getServletContext().getRealPath("/upload");
String fileName = "基础语法.jpg";
//1、设置response 响应头
response.reset(); //设置页面不缓存,清空buffer
response.setCharacterEncoding("UTF-8"); //字符编码
response.setContentType("multipart/form-data"); //二进制传输数据
//设置响应头
response.setHeader("Content-Disposition",
"attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));
File file = new File(path,fileName);
//2、 读取文件--输入流
InputStream input=new FileInputStream(file);
//3、 写出文件--输出流
OutputStream out = response.getOutputStream();
byte[] buff =new byte[1024];
int index=0;
//4、执行 写出操作
while((index= input.read(buff))!= -1){
out.write(buff, 0, index);
out.flush();
}
out.close();
input.close();
return null;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY