一次SSM操作過程記錄
一、準備階段
配置文件
- 配置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>
-
準備前端界面
-
準備配置文件
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>
配置調試
- 配置數據庫連接池
在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方式
-
編寫Controller代碼,返回映射的jsp頁面名稱。
-
編寫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}/"/>
錯誤記錄
- log4j錯誤信息
log4j:ERROR Could not find value for key log4j.appender.LOGFILE
log4j:ERROR Could not instantiate appender named "LOGFILE".
- 關於springMVC攔截後無法訪問靜態資源問題
No mapping found for HTTP request with URI [/] in DispatcherServlet with name 'dispatcherServlet'
解決:玄學