13.SSM框架集~Spring + SpringMVC + Mybatis 整合案例
本文是上一篇文章的後續,詳情點擊該鏈接
SpringMVC的響應
我們可以使用SpringMVC搭建一個項目,在單元方法中使用SpringMVC提供的方式來獲取請求信息,然後根據功能需求,聲明請求處理的邏輯代碼,進行請求的處理。當請求處理完成後,我們需要將此次請求的處理結果響應給瀏覽器,以前我們是自己在Servlet中使用response對象來完成響應的
使用ServletAPI方式
@Controller
@RequestMapping("/UserController")
public void UserController(HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//轉發,跳轉回去
response.sendRedirect(request.getContextPath() + "/main.jsp");
}
單元方法的返回值類型設置void。因爲使用response對象在單元方法中直接對此次請求進行了響應,不再通過DispatcherServlet了,既然已經響應了,就不需要再給DispatcherServlet返回值了。在單元方法上聲明HttpServletResponse形參,來接收此次請求的response對象。
使用forward關鍵字完成響應
@RequestMapping("/forWardJsp")
public String ForWardJsp(String name,Integer age){
//處理請求
System.out.println(name + " " + age);
//響應結果
return "forward:/main.jsp";
}
使用通過單元方法的返回值來告訴DispatcherServlet請求轉發指定的資源,如果是請求轉發,forward關鍵字可以省略不寫的。
使用redirect關鍵字完成響應
@RequestMapping("/redirectJsp")
public String redirectJsp(String name,Integer age){
//處理請求
System.out.println(name + " " + age);
//響應結果
return "redirect:/main.jsp";
}
使用通過單元方法的返回值來告訴DispatcherServlet重定向指定的資源,注意這個redirect關鍵字不可以省去。
使用View視圖轉發和重定向
@RequestMapping("/Demo")
public View Demo(HttpServletRequest request){
//轉發
//View v=new InternalResourceView("/main.jsp");
//重定向
View v =new RedirectView(request.getContextPath()+"/main.jsp");
return v;
}
RedirectView中所做的操作,最終的實現是在renderMergedOutputModel中完成實現的,簡單來說RedirectView實現了鏈接的重定向,並且將數據保存到FlashMap中,這樣在跳轉後的鏈接中可以獲取一些數據.
使用ModelAndView 轉發重定向
@RequestMapping("/DemoS")
public ModelAndView DemoS(HttpServletRequest request){
ModelAndView view = new ModelAndView();
//轉發一
//view.setViewName("forward:/main.jsp");
//重定向一
//view.setViewName("redirect:/main.jsp");
//轉發二
//view.setView(new InternalResourceView("/main.jsp"));
//重定向二
view.setView(new RedirectView(request.getContextPath() + "/main.jsp"));
return view;
}
ModelAndView中的Model代表模型,View代表視圖,這個名字就很好地解釋了該類的作用。業務處理器調用模型層處理完用戶請求後,把結果數據存儲在該類的model屬性中,把要返回的視圖信息存儲在該類的view屬性中,然後讓該ModelAndView返回該Spring MVC框架。
ResponseBody 響應 json 數據
關於ajax可以點擊這篇文章當瀏覽器發起一個ajax請求給服務器,服務器調用對應的單元方法處理ajax請求。 而ajax的請求在被處理完成後,其處理結果需要直接響應。而目前我們在單元方 法中響應ajax請求,使用的是response對象,需要我們自己將要響應的數據轉換 爲json字符串響應,比較麻煩,而我們一直希望在單元方法中無論是否是ajax請求,都使用return語句來完成資源的響應,既然我們希望使用單元方法的返回值來響應ajax請求的處理結果,而目前DispatcherServlet的底層會將單元方法的返回值按照請求轉發或者重定向來處理,所以就需要我們告訴DispatcherServlet,單元方法的返回值不要按照請求轉發或者重定向處理,而是按照直接響應處理,將單元方法的返回值直接響應給瀏覽器。
導入jackson的jar
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
//需要加上@ResponseBody,響應的結果直接是json對象,在前臺頁面無需轉換
@RequestMapping("/AjaxTest")
@ResponseBody
public User AjaxTest(HttpServletResponse response) throws IOException {
User user = new User(1,"alvin","man");
return user;
}
<!-- 導入jQuery -->
<script type="text/javascript" src="js/jquery-1.9.1.js"></script>
<script type="text/javascript">
$(function () {
$.post("AjaxTest",function (result) {
console.log(result)
});
},"json")
</script>
SSM整合案例
需求:SSM整合實現用戶登錄
在數據庫中創建用戶信息表
搭建好架構
先導入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alvin</groupId>
<artifactId>Login</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>Login Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<mysql-version>8.0.11</mysql-version>
<mybatis-version>3.5.2</mybatis-version>
<spring-version>5.2.2.RELEASE</spring-version>
<mybatis-spring-version>2.0.4</mybatis-spring-version>
<slf4j-version>1.7.25</slf4j-version>
<jstl-version>1.2</jstl-version>
<servlet-api-version>3.1.0</servlet-api-version>
<jsp-version>2.2</jsp-version>
<junit-version>4.12</junit-version>
<jackson-version>2.9.9</jackson-version>
</properties>
<dependencies>
<!--mysql的驅動依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<!--mybatis的核心依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis-version}</version>
</dependency>
<!--springIOC的核心依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<!--spring-jdbc連依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<!--spring-test依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring-version}</version>
</dependency>
<!--spring-webmvc依賴-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<!--mybatis連接spring的依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring-version}</version>
</dependency>
<!--日誌依賴-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-version}</version>
</dependency>
<!--jstl依賴-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl-version}</version>
</dependency>
<!--jackson依賴-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<!--jsp-servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet-api-version}</version>
<scope>provided</scope>
</dependency>
<!--jsp-api-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp-version}</version>
<scope>provided</scope>
</dependency>
<!--單元測試的依賴-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<!--AOP的命名空間依賴-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!--文件上傳組件的依賴-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!--跨服務文件訪問依賴-->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--引入tomcat服務器插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--指定tomcat的端口號-->
<port>8888</port>
<!--指定訪問的上下文路徑-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置Mybatis
<?xml version="1.0" encoding="UTF8"?>
<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:aop="http://www.springframework.org/schema/aop"
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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">
<!--把jdbc.properties文件引入-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--[A]連接數據庫 獲得數據源-->
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${m_driver}"></property>
<property name="url" value="${m_url}"></property>
<property name="username" value="${m_uname}"></property>
<property name="password" value="${m_pwd}"></property>
</bean>
<!--[B]獲得sqlsession工廠-->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="dataSource" ref="ds"></property>
<property name="typeAliasesPackage" value="com.alvin.pojo"></property>
</bean>
<!--[C]掃描mapper文件-->
<bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="factory"></property>
<property name="basePackage" value="com.alvin.mapper"></property>
</bean>
</beans>
配置service
<?xml version="1.0" encoding="UTF8"?>
<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:aop="http://www.springframework.org/schema/aop"
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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">
<!--包的掃描-->
<context:component-scan base-package="com.alvin.service.impl"></context:component-scan>
<!--AOP的切面操作-->
</beans>
配置Spring MVC
<?xml version="1.0" encoding="UTF8"?>
<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:aop="http://www.springframework.org/schema/aop"
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/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--@Controller-->
<context:component-scan base-package="com.alvin.controller"></context:component-scan>
<!--@RequestMapping-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--靜態資源放行標籤-->
<!--mapping:代表的是網絡中訪問的路徑 location:代表本地放行的文件位置-->
<mvc:resources mapping="/img/**" location="/img/"></mvc:resources>
<mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
<mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
</beans>
配置web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<!--【1】配置字符編碼過濾器-->
<filter>
<filter-name>enc</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>enc</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--【2】解析applicationContext.xml配置-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--【3】解析springmvc.xml-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--除jsp以外的所有的請求都會進servlet-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
Controller
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/loginUser")
public String Login(String uid,String pwd){
int id = 0;
//判斷賬號是否合法
if(!uid.equals("")&&uid != null){
id = Integer.parseInt(uid);
}
User user = userService.Login(id,pwd);
if(user != null){
return "redirect:/main.jsp";
}
return "redirect:/login.jsp";
}
}
Mapper
public interface UserMapper {
@Select("select * from user where uid = #{param1} and pwd = #{param2}")
User Login(Integer uid,String pwd);
}
Service
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
public User login(String uname, String pwd) {
return userMapper.selectOne(uname, pwd);
}
}
pojo
public class User implements Serializable {
private Integer uid;
private String uname;
private String pwd;
}//get set之類的就不再這裏寫了!