<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> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:springmvc-01.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 解決亂碼問題 --> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
解決json亂碼問題。即便web.xml配置了CharacterEncodingFilter,但若是返回的是json數據依然會出現亂碼問題。css
@Controller @RequestMapping("/hello") public class HelloController { /** * 解決json亂碼問題 * @return */ @ResponseBody @GetMapping(value = "/h1", produces = "application/json;charset=utf-8") public String h1() { User user = new User(2, "張三", 10); ObjectMapper objectMapper = new ObjectMapper(); String s = null; try { s = objectMapper.writeValueAsString(user); } catch (JsonProcessingException e) { e.printStackTrace(); } return s; } }
<?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 https://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"> <!-- 解決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> </beans>
Tomcat亂碼問題解決。html
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency>
@Controller @RequestMapping("/hello") public class HelloController { @ResponseBody @GetMapping("/h1") public String h1() { User user = new User(1, "張三", 10); ObjectMapper objectMapper = new ObjectMapper(); String s = null; try { s = objectMapper.writeValueAsString(user); } catch (JsonProcessingException e) { e.printStackTrace(); } return s; } /** * 直接將日期格式化爲Json,會輸出一個時間戳 1627822830320 * @return * @throws JsonProcessingException */ @ResponseBody @GetMapping("/h2") public String h2() throws JsonProcessingException { Date date = new Date(); ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(date); } /** * 將日期格式化後輸出。 * @return * @throws JsonProcessingException */ @ResponseBody @GetMapping(value = "/h3") public String h4() throws JsonProcessingException { Date date = new Date(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); mapper.setDateFormat(format); return mapper.writeValueAsString(date); } }
3.fastjson的使用。JSON.toJSONString(),將對象解析爲json字符串;JSON.parseObject(),json字符串解析爲對象。java
@Controller @RequestMapping("/hello") public class HelloController { @ResponseBody @GetMapping("/h1") public String h1() throws JsonProcessingException { User user = new User(2, "張三", 10); // User解析爲Json字符串 String s = JSON.toJSONString(user); // Json字符串解析爲User對象 User user1 = JSON.parseObject(s, User.class); return s + user1; } }
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <!-- 數據庫鏈接池 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> <!-- 低版本servlet-api --> <!--<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>--> <!-- 高版本的servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 文件上傳 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.8</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.8</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> </dependencies>
dao配置文件。database.properties、spring-dao.xml、mybatis.xml、mapper.xml。mysql
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai name=root password=123456
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:database.properties"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${driverClassName}"/> <property name="jdbcUrl" value="${url}"/> <property name="user" value="${name}"/> <property name="password" value="${password}"/> <property name="maxPoolSize" value="30"/> <property name="minPoolSize" value="10"/> <property name="autoCommitOnClose" value="false"/> <!-- 獲取鏈接超時時間 --> <property name="checkoutTimeout" value="10000"/> <!-- 鏈接失敗嘗試次數 --> <property name="acquireRetryAttempts" value="2"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- mybatis配置文件,web項目中value必須配置爲classpath:,不然沒法找到路徑。 --> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- mapper配置文件 --> <property name="mapperLocations" value="classpath*:com/my/dao/*.xml"/> <!-- 別名包的配置 --> <property name="typeAliasesPackage" value="com.my.pojo"/> </bean> <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!-- 將dao經過註解注入spring容器 --> <property name="basePackage" value="com.my.dao"/> </bean> </beans>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <package name="com.my.dao.User"/> </typeAliases> </configuration>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.my.dao.UserDao"> <select id="getAll" resultType="com.my.pojo.User"> select * from tb_user </select> </mapper>
spring-server層配置。web
<?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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans https://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/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:component-scan base-package="com.my.service"/> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add" propagation="REQUIRED"/> <tx:method name="query" read-only="true"/> </tx:attributes> </tx:advice> </beans>
<?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 https://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"> <!-- 掃描@Controller註解 --> <context:component-scan base-package="com.my.controller"/> <!-- 註解驅動。能夠使用@RequestMapping、@GetMapping定義url。 --> <mvc:annotation-driven/> <!-- 靜態資源過濾 --> <mvc:default-servlet-handler/> <!-- 視圖解析 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="classpath:spring-controller.xml"/> <import resource="classpath:spring-dao.xml"/> <import resource="classpath:spring-service.xml"/> </beans>
<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> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!-- 將Spring容器存在於Tomcat --> <param-value>classpath:applicationContext.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <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> <!-- session過時時間 --> <session-config> <session-timeout>15</session-timeout> </session-config> </web-app>
攔截器的概念。spring
攔截器的實現。sql
public class MyInterceptor implements HandlerInterceptor { /** * * @param request * @param response * @param handler * @return 返回true,執行下一個攔截器;返回false,攔截。 * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("方式執行前====="); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("方式執行後====="); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("=====方式執行後====="); } }
<?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 https://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"> <!-- 配置攔截器 --> <mvc:interceptors> <mvc:interceptor> <!-- /** 攔截這個請求下的全部的請求 --> <mvc:mapping path="/**"/> <bean class="com.my.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans>
文件上傳和下載的配置。數據庫
<!-- 文件上傳 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
<?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 https://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"> <!-- 文件上傳和下載 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 請求的編碼格式,必須和jsp的pageEncoding一致,以便正確讀取表單內容,默認爲ISO-8859-1 --> <property name="defaultEncoding" value="UTF-8"/> <!-- 上傳文件大小限制,單位爲字節,10485760=10M --> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean> </beans>
文件上傳和下載的代碼實現。apache
@Controller public class FileUploadController { /** * 自定義文件傳出。 * 會將上傳的名爲file的文件封裝爲CommonsMultipartFile。 * @param file * @param request * @return */ @PostMapping("/upload") public String fileUpload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException { String uploadFileName = file.getOriginalFilename(); if ("".equals(uploadFileName)) { return "redirect:/index.jsp"; } System.out.println("上傳文件名: " + uploadFileName); String s = "E:\\Temp" + File.separator + "update"; File path = new File(s); if (!path.exists()) { path.mkdir(); } System.out.println("文件保存路徑: " + path); InputStream inputStream = file.getInputStream(); FileOutputStream fileOutputStream = new FileOutputStream(new File(path, uploadFileName)); int len = 0; byte[] buffer = new byte[1024]; while ((len = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer); fileOutputStream.flush(); } inputStream.close(); fileOutputStream.close(); return "redirect:/index.jsp"; } /** * 使用CommonsMultipartFile中的方法直接完成文件傳輸。 * @param file * @param request * @return * @throws IOException */ @PostMapping("/upload") public String upload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException { String s = "E:\\Temp" + File.separator + "update2"; File path = new File(s); if (!path.exists()) { path.mkdir(); } System.out.println("文件保存路徑: " + path); file.transferTo(new File(path + "/" + file.getOriginalFilename())); return "redirect:/index.jsp"; } }
@Controller public class FileUploadController { @GetMapping("/download") public String download(HttpServletRequest request, HttpServletResponse response) throws IOException { String s = "E:\\Temp" + File.separator + "update"; String fileName = "筆記.txt"; // 設置響應頭 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(s, fileName); InputStream inputStream = new FileInputStream(file); ServletOutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read()) != -1) { outputStream.write(buffer, 0, len); outputStream.flush(); } outputStream.close(); inputStream.close(); return null; } }