SpringMVC
普通
-
配置 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>
<!-- DispatcherServlet 要绑定Spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动级别 : 1-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
/ * 匹配所有的请求,包括 jsp 页面
/ 只匹配所有的请求,不包括 jsp 页面
-
配置 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-3.0.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 id="/hello" class="com.wang.controller.Hello"/>
</beans>
-
写实现 Controller 接口的处理器类
package com.wang.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Hello implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
// 业务层处理返回结果
String res = "HelloMVC";
mv.addObject("msg", res);
mv.setViewName("test");
return mv;
}
}
注解
-
配置 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>
<!-- DispatcherServlet 要绑定Spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 启动级别 : 1-->
<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-3.0.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">
<context:component-scan base-package="com.wang.controller"/>
<!--不处理静态资源 .css .js .html .mp3 .mp4-->
<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>
-
注解实现处理类
package com.wang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller
@RequestMapping("/hello")
public class HelloCtrl {
@RequestMapping("/h1")
public String hello(Model model){
model.addAttribute("msg", "Hello, SpringMVC!");
// web-info/jsp/hello.jsp, return的字符串被字符解析器处理
// 加注解 @RestController, 返回值仍为字符串
return "hello";
}
}
RestFul 风格
package com.wang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
public class RestFul {
@RequestMapping(value = "/multi/{a}/{b}",method = RequestMethod.GET)
// 相当于
@GetMapping("/multi/{a}/{b}")
public String test(@PathVariable int a, @PathVariable int b, Model model){
model.addAttribute("msg", a*b);
return "hello";
}
}
@PostMapping
@DeleteMapping
@PutMapping
@PatchMapping
转发与重定向
删除视图解析器后 转发与 重定向如下:
@RequestMapping("m1")
public String test1(Model model){
model.addAttribute("msg","Test1");
// return "/WEB-INF/jsp/hello.jsp";
// return "forward:/WEB-INF/jsp/hello.jsp";
return "redirect:/index.jsp";
}
有视图解析器,转发只需要目标的jsp,重定向前面加 redirect:即可
传递的是对象,需要保证对象属性的名字和参数名字一样,就可以自动传过来参数
乱码问题可通过过滤器解决,url 需要为 / * ,才可解决 jsp 乱码问题,Spring 处理乱码问题需要在 web.xml 加一段配置,如下:
<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>
Controller 返回 JSON 数据
可以用 jackson,首先添加依赖,如下:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2</version>
</dependency>
@Controller + @ResponseBody 不会走视图解析器,会直接返回一个字符串,相当于一个 @RestController
@Controller
public class Jackson_test {
@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
@ResponseBody
public String test1() throws JsonProcessingException {
ArrayList list = new ArrayList();
User user1 = new User("张", 3, "女");
User user2 = new User("张", 3, "女");
Date date = new Date();
list.add(user1);
list.add(user2);
list.add(date);
ObjectMapper objectMapper = new ObjectMapper();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setDateFormat(simpleDateFormat);
return objectMapper.writeValueAsString(list);
}
}
Json 乱码不用每一个都设置produces,在 springmvc-servlet.xml 中配置如下:
<!--解决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>
也可以用 fastjson,如下:
java 对象转 json 字符串
JSON.toJSONString;
json 字符串转 java对象
JSON.parseObject();
java 对象转 json 对象
JSON.toJSON();
json 对象转 java 对象
JSON.toJavaObject();
Ajax
首先编写前端页面
<%--<%@ page isELIgnored="false" %>--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script src="${pageContext.request.contextPath}/statics/js/jquery-3.6.0.js"></script>
<script>
function a(){
$.ajax({
url:"${pageContext.request.contextPath}/a1",
data:{"name":$("#username").val()},
success:function (data){
alert(data);
}
})
}
</script>
</head>
<body>
<input type="text" id="username" onblur="a()">
</body>
</html>
需要在 controller 层创建一个链接 /a1,如下:
@RestController
public class AjaxController {
@RequestMapping("/a1")
public void a1(String name, HttpServletResponse response) throws IOException {
System.out.println(name);
if ("wang".equals(name)){
response.getWriter().println("true");
} else {
response.getWriter().println("false");
}
}
@RequestMapping("/a2")
public List<User> a2(){
List<User> users = new ArrayList<User>();
users.add(new User("王", 1, "女"));
users.add(new User("李", 2, "男"));
users.add(new User("赵", 3, "女"));
return users;
}
}
前端传递 username 的值,采用键值对的形式给 name 赋值 username.val,后端对传入的名字 name 进行判断,通过 success 函数传给前端数据为 data,前端对其进行显示或者其他处理。
下面是 /a2 链接的jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="${pageContext.request.contextPath}/statics/js/jquery-3.6.0.js"></script>
<script>
function b(){
$.post({
url:"${pageContext.request.contextPath}/a2",
success:function (data){
// console.log(data);
var html1 = "<>";
for (let i = 0; i < data.length; i++) {
html1 += "<tr>" +
"<td>" + data[i].name + "</td>" +
"<td>" + data[i].age + "</td>" +
"<td>" + data[i].sex + "</td>" +
" </tr>"
}
$("#content").html(html1);
}
})
}
// $("#btn").click(function (){
//
// })
</script>
</head>
<body>
<input type="button" value="加载数据" id="btn" onclick="b()">
<table>
<tr>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
</tr>
<tbody id="content">
</tbody>
</table>
</body>
</html>
拦截器 Interceptor
拦截器是 AOP 思想的具体应用,是SpringMVC 独有的,故配置在 SpringMVC 的 xml 中
自定义一个类,实现 HandlerInterceptor 接口,重写 preHandle 函数,如下:
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("======处理前======");
return true; // return false 则会被拦截
}
// postHandle,afterCompletion 用来输出日志等
}
在 SpringMVC 中配置拦截器,如下:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.wang.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
文件上传 下载
配置 Maven 依赖,如下:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
配置 applicationContext.xml,如下:
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
id="multipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10485760"/> <!--10M-->
<property name="maxInMemorySize" value="40960"/>
</bean>
编写表单:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload1" enctype="multipart/form-data" method="post">
<input type="file" name="file"/>
<input type="submit" value="upload"/>
</form>
</body>
</html>
编写文件上传函数
@RestController
public class FileCtrl {
@RequestMapping("/upload1")
public String upload1(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
String originalFilename = file.getOriginalFilename();
if ("".equals(originalFilename)){
return "redirect:/index.jsp";
}
// 设置上传的保存路径
String path = request.getServletContext().getRealPath("/upload");
File realPath = new File(path);
if (!realPath.exists()){
realPath.mkdir();
}
// 文件输入流 文件输出流
InputStream is = file.getInputStream();
FileOutputStream os = new FileOutputStream(new File(realPath, originalFilename));
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";
}
@RequestMapping("/upload2")
public String upload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
// 设置上传的保存路径
String path = request.getServletContext().getRealPath("/upload");
File realPath = new File(path);
if (!realPath.exists()){
realPath.mkdir();
}
// 通过 transferTo 写文件
file.transferTo(new File(path + "/" + file.getOriginalFilename()));
return "redirect:/index.jsp";
}
}
编写文件下载函数
@RequestMapping("/download")
public String download(HttpServletResponse response, HttpServletRequest request) throws IOException{
// 要下载的图片地址
String realPath = request.getServletContext().getRealPath("/upload");
String filename = "BingWallpaper.jpg";
// 设置响应头
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(filename, "utf-8"));
// 设置输入输出流
FileInputStream fis = new FileInputStream(new File(realPath, filename));
ServletOutputStream os = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = fis.read(buffer)) != -1){
os.write(buffer, 0, len);
os.flush();
}
os.close();
fis.close();
return "ok";
}
前端
分为:
逻辑:判断、循环
事件:浏览器事件(window,document)、DOM事件(增删改查节点元素内容)、jQuery
视图:html,css,bootstrap,layui
通信:xhr(ajax)、axios(Vue)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!