SpringMVC基礎-02

SpringMVC基礎-02

1.處理亂碼問題

  1. web.xml中配置CharacterEncodingFilter
<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>
  1. 解決json亂碼問題。即便web.xml配置了CharacterEncodingFilter,但若是返回的是json數據依然會出現亂碼問題。css

    1. 解決方式一。請求中設置produces = "application/json;charset=utf-8",定義輸出格式。
    @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;
        }
    }
    1. 解決方式二。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
            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>
  2. Tomcat亂碼問題解決。html

    1. 修改apache-tomcat-9.0.50\conf\server.xml中70行的配置。
    <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443"
    			   URIEncoding="UTF-8" />

2.json

  1. 導入依賴。有兩種json工具類,任選其一便可。
<!-- 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>
  1. jackson的使用。先new ObjectMapper();,而後調用writeValueAsString()方法
@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;
    }
}

3.SSM整合

  1. 導入依賴
<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>
  1. dao配置文件。database.properties、spring-dao.xml、mybatis.xml、mapper.xml。mysql

    1. database.properties,MySQL8.0以後,須要設置時區配置。
    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
    1. spring-dao.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"
           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>
    1. mabatis.xml配置。別名也能夠在spring-dao.xml中進行配置。
    <?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>
    1. mapper.xml配置。須要和com.my.dao.UserDao的路徑名稱保持一致。
    <?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>
  2. 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>
  1. spring-controller配置。
<?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>
  1. applicationContext.xml,將spring-dao.xml、spring-server.xml、spring-controller.xml到導入到applicationContext.xml中,在Tomcat啓動時加載。
<?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>
  1. 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>

  <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>

4.攔截器。

  1. 攔截器的概念。spring

    1. servlet中有過濾器(Filter)和監聽器(EventListener,監聽域對象中數據的變化),其中過濾器在url-pattern配置了/*以後,能夠對全部要訪問的資源進行攔截。
    2. 攔截器是SpringMVC框架本身的,只有使用了SpringMVC框架的工程才能夠使用,同時攔截器相似於Servlet中的過濾器。
    3. 攔截器只攔截訪問控制器的方法,若是訪問的是jsp/html/css/image/js是不會進行攔截的。
  2. 攔截器的實現。sql

    1. 定義一個攔截器。
    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("=====方式執行後=====");
        }
    }
    1. 配置攔截器。
    <?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>

5.文件上傳和下載

  1. 文件上傳和下載的配置。數據庫

    1. 須要導入的依賴。
    <!-- 文件上傳 -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.3</version>
    </dependency>
    1. 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
            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>
  2. 文件上傳和下載的代碼實現。apache

    1. 文件上傳。
    @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";
        }
    }
    1. 文件下載。
    @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;
        }
    }
相關文章
相關標籤/搜索