01-SSM練習筆記

一次SSM操作過程記錄

一、準備階段

配置文件

  1. 配置pom.xml文件
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>12</maven.compiler.source>
        <maven.compiler.target>12</maven.compiler.target>
        <argLine>-Dfile.encoding=UTF-8</argLine>
        <spring.version>5.0.2.RELEASE</spring.version>
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <mysql.version>8.0.17</mysql.version>
        <mybatis.version>3.4.5</mybatis.version>
        <spring.security.version>5.0.1.RELEASE</spring.security.version>
    </properties>

    <dependencies>        <!-- spring -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>

        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>        <!-- log end -->

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.9</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring.security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring.security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>${spring.security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>${spring.security.version}</version>
        </dependency>
            <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>jsr250-api</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
  1. 準備前端界面
    在這裏插入圖片描述

  2. 準備配置文件

spring配置文件

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

</beans>

springMVC配置文件

<?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:p="http://www.springframework.org/schema/p"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		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-4.0.xsd">

</beans>

mybatis配置文件

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

</configuration>

mybatis-mapper配置文件

<?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="">

</mapper>

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_3_1.xsd"
         version="3.1">

    <!--1. 配置ContextLoaderListener加載spring配置文件-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-context.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--2. 配置前端控制器-->
    <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-context.xml</param-value>
        </init-param>
        <!--啓動時初始化-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>

        <!-- DispatcherServlet 映射的 URL 地址 -->
        <!-- 大白話:什麼樣的訪問地址會交給 SpringMVC 來處理 -->
        <!-- 配置方式一:符合 RESTFUL 風格使用“/” -->
        <!-- <url-pattern>/</url-pattern> -->
        <!-- 配置方式二:請求擴展名 -->
<!--        <url-pattern>*.html</url-pattern>-->
<!--        <url-pattern>*.json</url-pattern>-->

        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--3. 配置filter-->
    <!--3.1 配置characterEncodingFilter 解決post請求亂碼問題-->
    <filter>
        <filter-name>characterEncodingFilter</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>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <!--強制響應進行編碼-->
        <init-param>
            <param-name>characterEncodingFilter</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

配置調試

  1. 配置數據庫連接池

在jdbc.properties文件中配置

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db10?serverTimezone=GMT%2B8
jdbc.user=root
jdbc.password=123456=

在spring-context文件中配置

	
	<!--1. 引入jdbc.properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--2. 配置數據庫連接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
	
	<!--2. 配置SqlSessionFactoryBean-->
    <bean id="sqlSessionFactoryBean"class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--2.1 裝配數據源-->
        <property name="dataSource" ref="dataSource"/>
        <!--2.2 指定mybatis全局配置文件位置-->
        <property name="configLocation" value="classpath:mybatis/mybatisconfig.xml"/>
        <!--2.3 指定mapper配置文件位置-->
        <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/>
    </bean>

    <!--3 配置MapperScannerConfigurer 把mapper接口類型的代理對象掃描到IOC容器中-->
    <bean id="mapperScannerConfigurer"
          class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--使用basePackage指定mapper所在的包-->
        <property name="basePackage" value="com.ymz.ssm.mapper"/>
    </bean>

    <!--4 開啓註解掃描-->
    <context:component-scan base-package="com.ymz.ssm.service"/>

測試類

// 指定Spring給junit提供的運行器類
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-context.xml"})
public class TestFile {
    @Autowired
    private DataSource dataSource;
    @Test
    public void testDataSource() throws SQLException {
        // 1. 通過數據源對象獲取數據源連接
        Connection connection = dataSource.getConnection();
        // 2. 打印數據庫連接
        System.out.println(connection);
    }
     @Test
    public void testMybatis(){
        User user = userService.findAll();
        System.out.println(user);
    }
    
}

配置log4j.properties文件

<!--log4j的依賴-->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>${log4j.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<!--log4j的依賴-->
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
# log4j.appender.LOGFILE=org.apache.log4j.FileAppender
# log4j.appender.LOGFILE.File=d:\axis.log
# log4j.appender.LOGFILE.Append=true
# log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
# log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

或者配置logback

<!--logback的依賴-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- 其他日誌框架的中間轉換包 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!--logback的依賴-->
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
	<!-- 指定日誌輸出的位置 -->
	<appender name="STDOUT"
		class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<!-- 日誌輸出的格式 -->
			<!-- 按照順序分別是:時間、日誌級別、線程名稱、打印日誌的類、日誌主體內容、換行 -->
			<pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
		</encoder>
	</appender>
	
	<!-- 設置全局日誌級別。日誌級別按順序分別是:DEBUG、INFO、WARN、ERROR -->
	<!-- 指定任何一個日誌級別都只打印當前級別和後面級別的日誌。 -->
	<root level="INFO">
		<!-- 指定打印日誌的appender,這裏通過“STDOUT”引用了前面配置的appender -->
		<appender-ref ref="STDOUT" />
	</root>

	<!-- 根據特殊需求指定局部日誌級別 -->
	<logger name="com.ymz.crowd.mapper" level="DEBUG"/>
	
</configuration>

聲明式事務

從事務角度:一個事務方法中包含的多個數據庫操作,要麼一起提交、要麼一起回滾。也就是說事務方法中的多個數據庫操作,有任何一個失敗,整個事務全部回滾。

從聲明式角度:由 Spring 來全面接管數據庫事務。用聲明式代替編程式。

<!--4 開啓註解掃描-->
    <context:component-scan base-package="com.ymz.ssm.service"/>

    <!--5.1 配置聲明式事務-->
    <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--5.2 配置aop-->
    <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* *..*ServiceImpl.*(..))"/>
        <!-- 將切入點表達式和事務通知關聯起來 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>
    <!--5.3 配置事務通知-->
    <tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager">
        <tx:attributes>
            <!-- 查詢方法:配置只讀屬性,讓數據庫知道這是一個查詢操作,能夠進行一定優化 -->
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="query*" read-only="true"/>
            <tx:method name="count*" read-only="true"/>

            <!-- 增刪改方法:配置事務傳播行爲、回滾異常 -->
            <!--
                propagation屬性:
                    REQUIRED:默認值,表示當前方法必須工作在事務中,如果當前線程上沒有已經開啓的事務,則自己開新事務。如果已經有了,那麼就使用這個已有的事務。
                        顧慮:用別人的事務有可能“被”回滾。
                    REQUIRES_NEW:建議使用的值,表示不管當前線程上有沒有事務,都要自己開事務,在自己的事務中運行。
                        好處:不會受到其他事務回滾的影響。
             -->
            <!--
                rollback-for屬性:配置事務方法針對什麼樣的異常回滾
                    默認:運行時異常回滾
                    建議:編譯時異常和運行時異常都回滾
             -->
            <tx:method name="save*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
            <tx:method name="update*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
            <tx:method name="remove*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
            <tx:method name="batch*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception"/>
        </tx:attributes>
    </tx:advice>

數據返回

引入jackson依賴

			<dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.10.3</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.10.3</version>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.10.3</version>
            </dependency>

ResultEntity類

package com.ymz.crowd.util;

/**
 * 統一整個項目中Ajax請求返回的結果(未來也可以用於分佈式架構各個模塊間調用時返回統一類型)
 * @author Lenovo
 *
 * @param <T>
 */
public class ResultEntity<T> {
	
	public static final String SUCCESS = "SUCCESS";
	public static final String FAILED = "FAILED";
	
	// 用來封裝當前請求處理的結果是成功還是失敗
	private String result;
	
	// 請求處理失敗時返回的錯誤消息
	private String message;
	
	// 要返回的數據
	private T data;
	
	/**
	 * 請求處理成功且不需要返回數據時使用的工具方法
	 * @return
	 */
	public static <Type> ResultEntity<Type> successWithoutData() {
		return new ResultEntity<Type>(SUCCESS, null, null);
	}
	
	/**
	 * 請求處理成功且需要返回數據時使用的工具方法
	 * @param data 要返回的數據
	 * @return
	 */
	public static <Type> ResultEntity<Type> successWithData(Type data) {
		return new ResultEntity<Type>(SUCCESS, null, data);
	}
	
	/**
	 * 請求處理失敗後使用的工具方法
	 * @param message 失敗的錯誤消息
	 * @return
	 */
	public static <Type> ResultEntity<Type> failed(String message) {
		return new ResultEntity<Type>(FAILED, message, null);
	}
	
	public ResultEntity() {
		
	}

	public ResultEntity(String result, String message, T data) {
		super();
		this.result = result;
		this.message = message;
		this.data = data;
	}

	@Override
	public String toString() {
		return "ResultEntity [result=" + result + ", message=" + message + ", data=" + data + "]";
	}

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

}

@ResponseBody註解 : 讓 handler 方法的返回值本身就是當前請求的響應數據。不再參考視圖處理器
中配置的前後綴信息。

RESTFUL&請求擴展名

符合 RESTFUL 風格使用“/”
1. 配置dispatcherServlet
    <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-context.xml</param-value>
        </init-param>
        <!--啓動時初始化-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 大白話:什麼樣的訪問地址會交給 SpringMVC 來處理 -->
        <!-- 配置方式一:符合 RESTFUL 風格使用“/” -->
        <!-- <url-pattern>/</url-pattern> -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

2. 在springMVC文件中加入<mvc:default-servlet-handler/>
  <mvc:default-servlet-handler/> 
  將在 SpringMVC 上下文中定義一個DefaultServletHttpRequestHandler,它會對進入DispatcherServlet 的請求進行篩查,如果發現是沒有 經過映射的請求,就將該請求交由 WEB 應用服務器默認的 Servlet 處理,如果不是靜態資源的請求,才由 DispatcherServlet 繼續處理
   一般 WEB 應用服務器默認的 Servlet 的名稱都是 default。若所使用的 WEB 服務器的默認 Servlet 名稱不是 default,則需要通過 default-servlet-name 屬性顯式指定
請求拓展名方式
1. 配置dispatcherServlet
    <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-context.xml</param-value>
        </init-param>
        <!--啓動時初始化-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.html</url-pattern>
        <url-pattern>*.json</url-pattern>
    </servlet-mapping>
作用:僞靜態
表面上看起來是一個訪問靜態資源的請求,但是實際上是由 SpringMVC交給 handler 來處理的動態資源。
好處 1:有利於 SEO 優化,讓搜索引擎更容易找到我們的網站,有利於網站的推廣
好處 2:隱藏後端技術實現細節給黑客入侵系統增加難度
好處 3:自動解決靜態資源訪問問題
  訪問 a.png 本身不符合*.html 這個 url-pattern,和 SpringMVC 完全沒有關係,當前請求由 Tomcat 處理。
  如果 url-pattern 映 射 了 “ / ”, 那 麼 SpringMVC 中 還 需 要 配 DefaultServletHandler。
 缺陷:不符合 RESTFUL 風格
2. 在springMVC文件中配置<mvc:view-controller path="" view-name=""/>處理靜態頁面跳轉

Spring MVC 默認啓動頁面

方法一:首先你必須配置MVC可以訪問靜態資源,纔可以訪問到jsp結尾的靜態頁面。其次配置web.xml 。啓動項目之後,就會默認訪問指定的 index.jsp 頁面。index.jsp頁面,放在webapp文件夾下

	<welcome-file-list>
        <welcome-file>index</welcome-file>
    </welcome-file-list>

方法二: 默認的頁面不是放在webapp文件夾下,而是放在web-inf下,那麼此時可以用springMVC方式

  1. 編寫Controller代碼,返回映射的jsp頁面名稱。

  2. 編寫spring-mvc.xml 配置文件

<mvc:annotation-driven />

<mvc:view-controller path="/" view-name="index"/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
</bean>

方法三:加入session判斷是否登錄

/**
 * 登陸攔截器
 * @author 18801
 *
 */
public class LoginInterceptor implements HandlerInterceptor {

	/**
	 * 在控制器執行之前完成業務邏輯操作
	 * 方法的返回值決定邏輯是否繼續執行, true,表示繼續執行, false, 表示不再繼續執行。
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		// 判斷當前用戶是否已經登陸
		HttpSession session = request.getSession();
		User loginUser = (User)session.getAttribute("loginUser");

		if ( loginUser == null ) {
			String path = session.getServletContext().getContextPath();
			response.sendRedirect(path + "/login");
			return false;
		} else {
			return true;
		}
	}

記錄

路徑相關

前臺路徑:<a href=”/sssss”><img src=””>
		相對服務器的根 : http://localhost:8080/sssss
後臺路徑:forward(”/user.jsp”), xml
		相對web應用的根:http://localhost:8080/atcrowdfunding-web/user.jsp

前臺路徑

<base href="http://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/"/>

錯誤記錄

  1. log4j錯誤信息
log4j:ERROR Could not find value for key log4j.appender.LOGFILE
log4j:ERROR Could not instantiate appender named "LOGFILE".
  1. 關於springMVC攔截後無法訪問靜態資源問題
No mapping found for HTTP request with URI [/] in DispatcherServlet with name 'dispatcherServlet'
    
解決:玄學
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章