日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块

發(fā)布時間:2025/3/21 javascript 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  • 概述
  • 功能簡介
  • 環(huán)境準(zhǔn)備
    • 構(gòu)建工具Maven
    • 數(shù)據(jù)庫腳本Oracle
    • 建立工程
    • 類包及Spring配置文件規(guī)劃
  • 持久層
    • 建立領(lǐng)域?qū)ο?ul>
    • 用戶領(lǐng)域?qū)ο?/li>
    • 登錄日志領(lǐng)域?qū)ο?/li>
  • UserDao
  • LoginLogDao
  • 在Spring中裝配DAO
  • 業(yè)務(wù)層
    • UserService
    • 在Spring中裝配Service
  • 使用TestNGN對業(yè)務(wù)類進行單元測試
  • 展現(xiàn)層
    • 配置Spring MVC 框架
    • 處理登錄請求
      • POJO控制器類
      • Spring MVC 配置文件
      • ModelAndView的解析配置
    • JSP視圖頁面
      • loginjsp
      • mainjsp
  • 運行Web應(yīng)用
      • 第一種方式 maven插件部署web應(yīng)用服務(wù)器
      • 第二種方式 部署到容器中
  • 總結(jié)
  • 附件 pomxml
  • 概述

    本模塊主要涉及以下部分:

    • Maven構(gòu)建web項目的過程
    • 登錄流程介紹
    • 基于Spring JDBC的持久層實現(xiàn)
    • 基于Spring 聲明式事務(wù)的業(yè)務(wù)層實現(xiàn)
    • 基于Spring MVC的展現(xiàn)層實現(xiàn)
    • 運行Web應(yīng)用

    功能簡介

  • 用戶訪問login.jsp,返回帶有用戶名和密碼輸入框的登錄頁面

  • 用戶輸入用戶名和密碼,提交表單到服務(wù)器,Spring根據(jù)配置文件調(diào)用LoginController控制器響應(yīng)請求

  • LoginController調(diào)用UserService的hasMatchUser()方法來判斷用戶是否存在

  • 如果用戶不存在,跳轉(zhuǎn)到登錄頁面,給出提示,否則進入下一步

  • 如果用戶存在,LoginController調(diào)用UserService的findUserByName方法,進行登錄成功后的業(yè)務(wù)處理:首先調(diào)用updateLoginInfo的updateLoginInfo方法 增加5分積分,然后創(chuàng)建一個LoginLog對象,將LoginLog寫入數(shù)據(jù)庫

  • 重定向到主頁面,將響應(yīng)返回給用戶


  • 環(huán)境準(zhǔn)備

    構(gòu)建工具Maven

    請參考上篇博文 Maven-EclipseEE使用Maven構(gòu)建Java web項目從0到1


    數(shù)據(jù)庫腳本(Oracle)

    -- Create table create table TEMP_USER (user_id NUMBER not null,user_name VARCHAR2(50),password VARCHAR2(10),credits NUMBER,last_visit DATE,last_ip VARCHAR2(20) ) tablespace TAB_XGJpctfree 10initrans 1maxtrans 255storage(initial 64Kminextents 1maxextents unlimited); -- Create/Recreate primary, unique and foreign key constraints alter table TEMP_USERadd constraint PK_USER_ID primary key (USER_ID)using index tablespace TAB_XGJpctfree 10initrans 2maxtrans 255;-- Create sequence create sequence TEMP_USER_ID_SEQ minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;-- Create table create table TEMP_LOGIN_LOG (login_log_id NUMBER not null,user_id NUMBER not null,ip VARCHAR2(20),login_datetime DATE ) tablespace TAB_XGJpctfree 10initrans 1maxtrans 255storage(initial 64Kminextents 1maxextents unlimited); -- Create/Recreate primary, unique and foreign key constraints alter table TEMP_LOGIN_LOGadd constraint PK_LOGIN_LOG_ID primary key (LOGIN_LOG_ID)using index tablespace TAB_XGJpctfree 10initrans 2maxtrans 255; alter table TEMP_LOGIN_LOGadd constraint FK_USER_ID foreign key (USER_ID)references TEMP_USER (USER_ID);-- Create sequence create sequence TEMP_LOGIN_LOG_ID_SEQ minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;--simulate data INSERT INTO TEMP_USER (user_id,user_name,password) VALUES(TEMP_USER_ID_SEQ.Nextval ,'xgj','123456'); COMMIT;

    建立工程

    請參考上篇博文 Maven-EclipseEE使用Maven構(gòu)建Java web項目從0到1


    類包及Spring配置文件規(guī)劃

    類包以分層的方式進行組織,供劃分為dao、domain、service、web。

    domain對象嚴(yán)格意義上講屬于業(yè)務(wù)層,但是由于domain對象可能同時被持久層和展現(xiàn)層共享,所以一般單獨的將其劃分在一個包中。


    持久層

    持久層負責(zé)數(shù)據(jù)的訪問和操作,DAO類被上層的業(yè)務(wù)類調(diào)用。

    這里使用Spring JDBC作為持久層的實現(xiàn)技術(shù)。

    用戶領(lǐng)域?qū)ο?/h3>

    可以看成對TEMP_USER表的對象映射,每個字段對應(yīng)一個對象屬性。

    package com.xgj.domain;import java.io.Serializable; import java.util.Date;/*** @ClassName: User* @Description: User實體類,可以簡單的理解為對 temp_user表的字段映射* @author: Mr.Yang* @date: 2017年6月24日 下午6:45:12*/// 領(lǐng)域?qū)ο笠话愣家獙崿F(xiàn)Serializable接口,以便可以序列化 public class User implements Serializable {private int userId;private String username;private String password;private int credit;private Date lastVisit;private String lastIP;public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getCredit() {return credit;}public void setCredit(int credit) {this.credit = credit;}public Date getLastVisit() {return lastVisit;}public void setLastVisit(Date lastVisit) {this.lastVisit = lastVisit;}public String getLastIP() {return lastIP;}public void setLastIP(String lastIP) {this.lastIP = lastIP;}}

    package com.xgj.domain;import java.io.Serializable; import java.util.Date;/*** * @ClassName: LoginLog* * @Description: 登錄信息實體類,可以簡單的理解為對 TEMP_LOGIN_LOG表的字段映射* * @author: Mr.Yang* * @date: 2017年6月24日 下午8:12:28* * *///領(lǐng)域?qū)ο笠话愣家獙崿F(xiàn)Serializable接口,以便可以序列化 public class LoginLog implements Serializable {private int login_log_id;private int user_id;private String ip;private Date login_datetime;public int getLogin_log_id() {return login_log_id;}public void setLogin_log_id(int login_log_id) {this.login_log_id = login_log_id;}public int getUser_id() {return user_id;}public void setUser_id(int user_id) {this.user_id = user_id;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public Date getLogin_datetime() {return login_datetime;}public void setLogin_datetime(Date login_datetime) {this.login_datetime = login_datetime;} }

    UserDao

    首先來定義訪問User的DAO。

    按照設(shè)計,主要包括3個方法

    • getMatchCount(String username,String passwd)
    • findUserbyUsername(tring username)
    • updateLoginInfo(User user) 更新用戶積分、最后登錄IP和最后登錄時間
    package com.xgj.dao;import java.sql.ResultSet; import java.sql.SQLException;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.stereotype.Repository;import com.xgj.domain.User;/*** * @ClassName: UserDao* * @Description: 定義訪問User的DAO.操作TEMP_USER表* * @author: Mr.Yang* * @date: 2017年6月24日 下午8:19:34* * */ @Repository // 通過Spring注解定義一個DAO public class UserDao {private JdbcTemplate jdbcTemplate;private final static String MATCH_COUNT_SQL = " SELECT count(*) FROM temp_user "+ " WHERE user_name =? and password=? ";private final static String UPDATE_LOGIN_INFO_SQL = " UPDATE temp_user SET "+ " last_visit=?,last_ip=?,credits=? WHERE user_id =? ";@Autowired // 自動注入JdbcTemplate的beanpublic void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}/*** * * @Title: getMatchCount* * @Description: 查詢是否有匹配的user* * @param username* @param password* * @return: int*/public int getMatchCount(String username, String password) {return jdbcTemplate.queryForObject(MATCH_COUNT_SQL, new Object[] { username, password }, Integer.class);}/*** * @Title: findUserbyUsername* * @Description: 根據(jù)username查詢用戶信息* * @param username* * @return: User*/public User findUserbyUsername(final String username) {String querySql = " SELECT user_id,user_name,credits " + " FROM temp_user WHERE user_name =? ";final User user = new User();// 根據(jù)username查詢用戶信息jdbcTemplate.query(querySql, new Object[] { username }, new RowCallbackHandler() {public void processRow(ResultSet rs) throws SQLException {user.setUserId(rs.getInt("user_id"));user.setUsername(username);user.setCredit(rs.getInt("credits"));}});return user;}/*** @Title: updateLoginInfo* * @Description: updateLoginInfo* * @param user* * @return: void*/public void updateLoginInfo(User user) {jdbcTemplate.update(UPDATE_LOGIN_INFO_SQL,new Object[] { user.getLastVisit(), user.getLastIP(), user.getCredit(), user.getUserId() });}}
    • Spring 2.5之后可以使用注解的方式定義Bean,較之XML的配置方式,注解配置的方式更加簡單明了,推薦使用。

    • 通過@Repository定義一個DAO Bean,然后使用@Autowired將Spring容器中的Bean注入進來。

    • 操作數(shù)據(jù)庫使用Spring JDBC ,對傳統(tǒng)的JDBC API進行了薄層封裝。 Spring JDBC通過模板類

    • org.springframework.jdbc.core.JdbcTemplate封裝了樣板式的o碼,用戶可以很輕松的完成大部分?jǐn)?shù)據(jù)訪問操作。


    LoginLogDao

    LoginLogDao 負責(zé)記錄用戶的登錄日志,僅僅有一個方法 insertLoginLog(LoginLog loginLog)

    package com.xgj.dao;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository;import com.xgj.domain.LoginLog;@Repository // 通過Spring注解定義一個DAO public class LoginLogDao {private JdbcTemplate jdbcTemplate;// 保存登陸日志SQLprivate final static String INSERT_LOGIN_LOG_SQL = "INSERT INTO TEMP_LOGIN_LOG(login_log_id,user_id,ip,login_datetime) VALUES(TEMP_LOGIN_LOG_ID_SEQ.nextval,?,?,?)";@Autowired // 自動注入JdbcTemplate的Beanpublic void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void insertLoginLog(LoginLog loginLog) {Object[] args = { loginLog.getUser_id(), loginLog.getIp(), loginLog.getLogin_datetime() };jdbcTemplate.update(INSERT_LOGIN_LOG_SQL, args);System.out.println("成功");}}

    在Spring中裝配DAO

    我們在編寫DAO接口實現(xiàn)類的時候,我們并沒有看到打開、釋放數(shù)據(jù)庫connection的代碼, 那DAO類是如何訪問數(shù)據(jù)庫的呢?

    是的 JdbcTemplate封裝起來了, JdbcTemplate 本身需要一個數(shù)據(jù)源DataSource,這樣它就可以從DataSource中獲取或者返回連接。

    在UserDAO和LoginDAO都提供了一個帶@Autowired注解的JdbcTemplate變量,所以我們必須先聲明一個數(shù)據(jù)源,然后定義一個JdbcTemplate變量,通過Spring的容器上下文自動綁定機制注入bean.

    Maven工程,在src\resources(資源文件目錄),創(chuàng)建Spring的配置文件

    <?xml version="1.0" encoding="UTF-8" ?> <!--引用Spring的多個Schema空間的格式定義文件--> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"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 http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd<!-- 掃描類包,將標(biāo)注Spring注解的類自動轉(zhuǎn)化Bean,同時完成Bean的注入 --><context:component-scan base-package="com.xgj.dao"/><!-- 配置數(shù)據(jù)源 http://langgufu.iteye.com/blog/2200588--><!-- mysql<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver"p:url="jdbc:mysql://localhost:3306/sampledb"p:username="root"p:password="123456" /> --><!-- oracle 兩種寫法<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/><property name="url" value="jdbc:oracle:thin:@172.25.246.11:1521:cc"/><property name="username" value="cctb"/><property name="password" value="zsmart2017"/></bean> --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"p:driverClassName="oracle.jdbc.driver.OracleDriver"p:url="jdbc:oracle:thin:@172.25.246.11:1521:cc"p:username="cctb"p:password="smart" /><!-- 配置Jdbc模板 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"p:dataSource-ref="dataSource" /></beans>
    • 我們使用<context:component-scan base-package="目錄名稱"/> 掃描指定類包下的所有類,這樣在類中定義的注解比如@Respoitiry @Autowired等才會產(chǎn)生作用
    • 我們使用Jakarta的DBCP開源數(shù)據(jù)實現(xiàn)方案定義一個數(shù)據(jù)源
    • 配置 將 上一步的DataSource注入到JdbcTemplate中, 而這個JdbcTemplate將通過@Autowired自動注入到LoginDao和UserDao的Bean中, 可見Spring可以很好地將注解配置和XML配置統(tǒng)一起來。

    這樣 就完成了登錄模塊的持久層所有的開發(fā)工作


    業(yè)務(wù)層

    我們設(shè)計的登錄模塊,業(yè)務(wù)層僅有一個業(yè)務(wù)類 UserService。

    UserService負責(zé)將持久層的UserDAO和LoginLogDao組織起來,完成用戶密碼認證、登錄日志記錄等操作。

    UserService

    三個業(yè)務(wù)方法

  • boolean hasMatchUser(String username, String password)
  • User findUserByName(String username)
  • void loginSuccess(User user)
  • UserService的實現(xiàn)類需要調(diào)用DAO層的兩個DAO完成業(yè)務(wù)邏輯操作。

    package com.xgj.service;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import com.xgj.dao.LoginLogDao; import com.xgj.dao.UserDao; import com.xgj.domain.LoginLog; import com.xgj.domain.User;@Service // 將UserService標(biāo)注為一個服務(wù)層的bean public class UserService {private UserDao userDao;private LoginLogDao loginLogDao;@Autowired // 注入beanpublic void setUserDao(UserDao userDao) {this.userDao = userDao;}@Autowired // 注入beanpublic void setLoginLogDao(LoginLogDao loginLogDao) {this.loginLogDao = loginLogDao;}public boolean hasMatchUser(String username, String password) {return userDao.getMatchCount(username, password) > 0;}public User findUserByName(String username) {return userDao.findUserbyUsername(username);}@Transactionalpublic void loginSuccess(User user) {// credit 增加5分user.setCredit(5 + user.getCredit());LoginLog loginLog = new LoginLog();loginLog.setUser_id(user.getUserId());loginLog.setIp(user.getLastIP());loginLog.setLogin_datetime(user.getLastVisit());userDao.updateLoginInfo(user);loginLogDao.insertLoginLog(loginLog);}}

    其中 loginSuccess方法將兩個DAO組織起來,共同完成一個事務(wù)性的數(shù)據(jù)操作:更新temp_user表 并 添加temp_login_Log表的記錄。

    我們在UserService中看不出來任何事務(wù)操作的影子,這正是Spring的高明之處,通過注解和配置文件配置的方式,將我們從事務(wù)操作單調(diào)機械的代碼中解脫出來。


    下面我們來看下Spring是如何裝載Service的

    在Spring中裝配Service

    事務(wù)管理的代碼雖然僅僅是以注解@Transactional的方式出現(xiàn)在程序代碼中,但是我們必須告訴Spring哪些業(yè)務(wù)類需要工作在事務(wù)環(huán)境下以及事務(wù)的規(guī)則等,以方便Spring根據(jù)這些信息自動為目標(biāo)業(yè)務(wù)類添加事務(wù)管理的功能。

    <?xml version="1.0" encoding="UTF-8" ?> <!--(1)引入aop以及tx命名空間和對應(yīng)的Schema文件--> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"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 http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.3.xsd"><context:component-scan base-package="com.xgj.dao"/><!-- 2)掃描類Service類包,將標(biāo)注Spring注解的類自動轉(zhuǎn)化Bean,同時完成Bean的注入 --><context:component-scan base-package="com.xgj.service"/><!-- 配置數(shù)據(jù)源 http://langgufu.iteye.com/blog/2200588--><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"p:driverClassName="oracle.jdbc.driver.OracleDriver"p:url="jdbc:oracle:thin:@172.25.246.11:1521:cc"p:username="cctb"p:password="smart" /><!-- 配置Jdbc模板 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"p:dataSource-ref="dataSource" /><!-- (3)配置事務(wù)管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"p:dataSource-ref="dataSource" /><!-- (4)通過AOP配置提供事務(wù)增強,讓service包下所有Bean的所有方法擁有事務(wù) --><aop:config proxy-target-class="true"><aop:pointcut id="serviceMethod"expression="(execution(* com.xgj.service..*(..))) and (@annotation(org.springframework.transaction.annotation.Transactional))" /><aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice" /></aop:config><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" /></tx:attributes></tx:advice> </beans>

    查看 (1)(2)(3)(4) 步驟以及說明。

    這樣就完成了業(yè)務(wù)層的程序開發(fā)和配置工作, 接下來需要對該業(yè)務(wù)類進行單元測試


    使用TestNGN對業(yè)務(wù)類進行單元測試

    TestNG和Junit相比有了重大的改進,我們在這里使用TestNGN使用單元測試。

    步驟:

    • 添加TestNGN依賴包到跟模塊的pom.xml文件中
    <dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>${testng.version}</version><scope>test</scope></dependency>

    其中 版本為 6.8.7

    <properties><testng.version>6.8.7</testng.version> </properties>
    • 因本模塊采用Maven構(gòu)建 ,所以在約定目錄下 src\test\java測試目錄下創(chuàng)建和UserService一致的包結(jié)構(gòu),并創(chuàng)建UserService對應(yīng)的測試類UserServiceTest ,目錄如下:

    • 編寫測試代碼

    package com.xgj.service;import java.util.Date;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests; import org.testng.annotations.Test; import static org.testng.Assert.*;import com.xgj.domain.User;@ContextConfiguration("classpath*:/spring-context.xml") public class UserServiceTest extends AbstractTransactionalTestNGSpringContextTests {@Autowiredprivate UserService userService;@Testpublic void testHashUserMatch(){boolean b1 = userService.hasMatchUser("xgj", "123456");boolean b2 = userService.hasMatchUser("wrongname", "123456");assertTrue(b1);assertTrue(!b2);}@Testpublic void testFindUserByUserName()throws Exception{for(int i =0; i< 100;i++) {User user = userService.findUserByName("xgj");assertEquals(user.getUsername(), "xgj");}}@Testpublic void testAddLoginLog() {User user = userService.findUserByName("xgj");user.setUserId(1);user.setUsername("xgj");user.setLastIP("172.24.21.53");user.setLastVisit(new Date());userService.loginSuccess(user);} }

    Spring4.0的測試框架很好的整合了TestNGN單元測試框架, 測試代碼通過擴展Spring測試框架提供的測試基類AbstractTransactionTestNGSpringContextTests來啟動測試運行器。

    通過@ContextConfiguration注解來指定Spring的配置文件。

    使用@Autowired 將Spring容器中的Bean注入到測試類中。

    在測試方法前通過TestNGN的@Test注解方法即可將方法標(biāo)注為測試方法。

    • 運行測試類

    選中項目,右鍵 Runas —Maven Test

    觀察運行結(jié)果,確保無錯誤。


    展現(xiàn)層

    我們已經(jīng)開發(fā)完成了持久層和業(yè)務(wù)層 ,是時候提供一個簡單的頁面了~

    在這里我們使用SpringMVC作為展現(xiàn)層的技術(shù)選擇。

    Spring3.0提供了REST風(fēng)格的MVC,使Spring MVC變的更加輕便、已用。

    Spring4.0對MVC進行了全面的增強,支持跨域注解@CrossOrigin配置、GroovyWeb集成、Gson、Jackson、Protobuf的HttpMessageConverter消息轉(zhuǎn)換器等。

    配置Spring MVC 框架

    • 配置web.xml,以便Web容器啟動的時候能夠自動啟動Spring容器。
    <?xml version="1.0" encoding="UTF-8"?> <web-app 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_3_0.xsd"version="3.0"><display-name>Archetype Created Web Application</display-name><!--(1) 從類路徑下加載Spring配置文件,classpath關(guān)鍵字--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-context.xml</param-value></context-param><!--(2)負責(zé)啟動Spring容器的監(jiān)聽器,它將引用(1)處的上下文參數(shù)獲得Spring配置文件的地址 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>.... </web-app>

    在(1)處通過web容器上線文參數(shù)指定Spring配置文件的地址,多個配置文件使用逗號或者空格分隔,建議逗號。

    然后在(2)處指定Spring所提供的ContextLoaderListener的web容器監(jiān)聽器,該監(jiān)聽器活在web容器啟動時自動運行,它會根據(jù)contextConfigLocationWeb容器參數(shù)獲取Spring配置文件,并啟動Spring容器。

    注意需要將log4j.propertis日志配置文件放在類路徑下,以便日志引擎自動生效。

    最后需要配置SpringMVC相關(guān)的信息, SpringMVC也是通過一個Servlet來截取URL請求,然后再進行相關(guān)的處理

    <!--(1)Spring MVC 的主Servlet--><servlet><servlet-name>smart</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>3</load-on-startup></servlet><!--(2)Spring MVC 處理的URL--><servlet-mapping><servlet-name>smart</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping>

    在(1)處生命了一個Servlet,Spring MVC 也擁有一個Spring配置文件(后面涉及),該配置文件的文件名稱和此處定義的Servlet名有一個契約,即<Servlet名>-servlet.xml的形式.

    在這里,我們定義的Servlet的名稱為smart ,因此在/WEB-INF目錄下必須提供一個名為smart-servlet.xml的Spring MVC 配置文件。但是這個配置文件無需通過web.xml的contextConfigLocation上下文參數(shù)進行聲明, Spring MVC 會自動將smart-servlet.xml文件和Spring的其他配置文件進行拼裝。

    在(2)處對這個Servlet的URL路徑進行定義,在這里讓所有以.html為后綴的URL都能被smart Servlet截獲, 進而轉(zhuǎn)由Spring MVC框架進行處理。

    這種方式的好處: 使用.html后綴 ,一方面用戶不能通過URL直接指導(dǎo)我們采用了何種服務(wù)端技術(shù),另一方面.html是靜態(tài)網(wǎng)頁的后綴,可以騙過搜索引擎,增加被收錄的概率。 推薦采用這種后綴。

    對已那些真正無需任何動態(tài)處理的靜態(tài)網(wǎng)頁,則可以使用.htm后綴加以區(qū)分,以避免被框架截獲。

    當(dāng)請求被Spring MVC截獲后,首先根據(jù)請求的URL來查找目標(biāo)的處理控制器,并將請求參數(shù)封裝“命令”對象一起傳給控制器處理, 然后控制器調(diào)用Spring容器中的業(yè)務(wù)Bean完成業(yè)務(wù)處理工作并返回結(jié)果視圖。

    處理登錄請求

    POJO控制器類

    首先編寫LoginController類,負責(zé)處理登錄請求,完成登錄業(yè)務(wù)。

    package com.xgj.web;import java.util.Date;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView;import com.xgj.domain.User; import com.xgj.service.UserService;//(1)標(biāo)注稱為Spring MVC的Controller @RestController public class LoginController{private UserService userService;// (2)負責(zé)處理 /index.html的請求@RequestMapping(value = "/index.html")public String loginPage(){return "login";}// (3)負責(zé)處理 /loginCheck.html的請求@RequestMapping(value = "/loginCheck.html")public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){boolean isValidUser = userService.hasMatchUser(loginCommand.getUserName(),loginCommand.getPassword());if (!isValidUser) {return new ModelAndView("login", "error", "密碼錯誤,請重新登錄");} else {User user = userService.findUserByName(loginCommand.getUserName());user.setLastIP(request.getLocalAddr());user.setLastVisit(new Date());userService.loginSuccess(user);request.getSession().setAttribute("user", user);return new ModelAndView("main");}}// 自動注入bean@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;} }

    在(1)處通過Spring MVC的 @RestController(或者@Controller)注解可以將任何一個POJO的類標(biāo)注為Spring MVC的控制器,處理HTTP請求。 當(dāng)然了 標(biāo)注了 @RestController(或者@Controller)首先是一個Bean,所以可以通過使用@Autowired進行Bean的注入。

    一個控制器可以擁有多個處理映射不同HTTP請求路徑的方法,比如(2)(3)。

    請求參數(shù)會根據(jù)參數(shù)名稱默認契約自動綁定到相應(yīng)方法的入?yún)⒅小?比如 在(3)中的loginCheck(HttpServletRequest request,LoginCommand loginCommand)方法中,請求參數(shù)會按照名稱匹配到loginCommand的入?yún)⒅小?

    請求響應(yīng)方法可以返回一個ModelAndView,或者直接返回一個字符串,SoringMVC會解析并轉(zhuǎn)向目標(biāo)響應(yīng)頁面。

    ModelAndView對象既包括視圖信息,又包括視圖渲染所需要的模型數(shù)據(jù)信息。

    剛才提到的LoginCommand對象是一個POJO,沒有繼承特定的父類或者實現(xiàn)特定的接口。 LoginCommand僅僅包括用戶名和密碼這兩個屬性(和請求的用戶密碼參數(shù)名稱一樣)

    package com.xgj.web;public class LoginCommand {private String userName;private String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;} }

    Spring MVC 配置文件

    編寫好LoginCommand后,需要在smart-servlet.xml中聲明該控制器,掃描Web路徑,指定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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 掃描web包,應(yīng)用Spring的注解 --><context:component-scan base-package="com.xgj.web"/> <!-- 配置視圖解析器,將ModelAndView及字符串解析為具體的頁面 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/jsp/"p:suffix=".jsp" /></beans>

    ModelAndView的解析配置

    在LoginController 控制器類中

    ..... return new ModelAndView("login", "error", "密碼錯誤,請重新登錄"); ...... return new ModelAndView("main");

    ModelAndView的第一個參數(shù)代表視圖的邏輯名,第二、第三個參數(shù)分別為數(shù)據(jù)模型名稱和數(shù)據(jù)模型對象,數(shù)據(jù)模型對象將以數(shù)據(jù)模型名稱為參數(shù)名放置到request的屬性中

    那么Spring是如何將視圖邏輯名稱解析為具體的視圖頁面呢?
    同樣的 我們需要在smart-servlet中提供一個定義解析規(guī)則的bean

    <!-- 配置視圖解析器,將ModelAndView及字符串解析為具體的頁面 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/jsp/"p:suffix=".jsp" />

    Spring MVC為視圖名到具體視圖的映射提供了需要到中方法,這里我們使用 InternalResourceViewResolver。

    它通過為視圖邏輯名添加前后綴的方式進行進行解析。

    比如 邏輯視圖名為 “l(fā)ogin”,將根據(jù)配置解析為/WEB-INF/jsp/login.jsp ,同樣的 邏輯視圖名為“main”,將解析為/WEB-INF/jsp/main.jsp


    JSP視圖頁面

    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html><head><title>登錄</title></head><body><c:if test="${!empty error}"><font color="red"><c:out value="${error}" /></font></c:if> <form action="<c:url value="loginCheck.html"/>" method="post">用戶名:<input type="text" name="userName"><br>密 碼:<input type="password" name="password"><br><input type="submit" value="登錄" /><input type="reset" value="重置" /></form></body> </html>

    JSTL標(biāo)簽中中引用了 error變量正是LoginController中返回的 return new ModelAndView(“l(fā)ogin”, “error”, “密碼錯誤,請重新登錄”); 對象所聲明的error參數(shù)。

    由于我們將 jsp放在了 WEB-INF/jsp目錄下,所以無法通過URL直接訪問,必須通過LoginController控制類中標(biāo)注了@RequestMapping(value = “/index.html”)的loginPage()方法進行轉(zhuǎn)發(fā)。


    main.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>論壇</title> </head> <body>${user.username},歡迎您進入論壇,您當(dāng)前積分為${user.credit}; </body> </html>

    main頁面 僅適用JSTL標(biāo)簽顯示一條歡迎信息。


    運行Web應(yīng)用

    第一種方式 maven插件部署web應(yīng)用服務(wù)器

    這里我們使用jetty服務(wù)器插件,首先在pom.xml中配置插件

    <!-- jetty插件 --><plugin><groupId>org.mortbay.jetty</groupId><artifactId>maven-jetty-plugin</artifactId><version>6.1.25</version><configuration><connectors><connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"><port>8080</port><maxIdleTime>60000</maxIdleTime></connector></connectors><contextPath>/${project.artifactId}</contextPath><scanIntervalSeconds>5</scanIntervalSeconds></configuration></plugin>

    運行: 選中項目,右鍵 Run as - Run Jetty

    http://localhost:8080/hello-spring4/index.html


    第二種方式 部署到容器中

    在eclipse中配置 Tomcat 容器,然后

    選中項目,右鍵 Run as - Run on Server

    同樣可以達到訪問的目的

    總結(jié)

    雖然是一個小的登錄模塊,重點是體會開發(fā)的過程,使用Spring MVC、SpringJDBC、Spring聲明式事務(wù)等技術(shù)。

    附件 pom.xml

    <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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xgj</groupId><artifactId>hello-spring4</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version><name>hello-spring4 Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><!-- spring 依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</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-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>${commons-dbcp.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectj.version}</version></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>${testng.version}</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version><scope>test</scope></dependency><!-- 添加oracle jdbc driver --><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>${oracle.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency></dependencies><build><finalName>hello-spring4</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin><!-- jetty插件 --><plugin><groupId>org.mortbay.jetty</groupId><artifactId>maven-jetty-plugin</artifactId><version>6.1.25</version><configuration><connectors><connector implementation="org.mortbay.jetty.nio.SelectChannelConnector"><port>8080</port><maxIdleTime>60000</maxIdleTime></connector></connectors><contextPath>/${project.artifactId}</contextPath><scanIntervalSeconds>5</scanIntervalSeconds></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.17</version><configuration><parallel>methods</parallel><threadCount>10</threadCount></configuration></plugin></plugins></build><properties><file.encoding>UTF-8</file.encoding><spring.version>4.3.9.RELEASE</spring.version><servlet.version>3.1.0</servlet.version><aspectj.version>1.8.1</aspectj.version><commons-dbcp.version>1.4</commons-dbcp.version><jetty.version>8.1.8.v20121106</jetty.version><slf4j.version>1.7.5</slf4j.version><testng.version>6.8.7</testng.version><oracle.version>11.2.0.4.0</oracle.version><jstl.version>1.2</jstl.version></properties> </project>

    總結(jié)

    以上是生活随笔為你收集整理的Spring-Spring MVC + Spring JDBC + Spring Transaction + Maven 构建web登录模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    91精品老司机久久一区啪 | 色狠狠久久av五月综合 | 黄色片视频在线观看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 日本久久高清视频 | 国产精品国产亚洲精品看不卡 | 一级免费看视频 | 久久精品之 | a级成人毛片 | 亚洲欧美日韩一级 | 中文字幕超清在线免费 | 欧日韩在线 | 99视频国产精品免费观看 | 色偷偷97| 国产福利91精品一区 | 久久综合亚洲鲁鲁五月久久 | 在线婷婷 | 涩涩伊人 | 亚洲精品午夜久久久久久久久久久 | 国产一级视频在线免费观看 | 国产黄 | 亚洲欧美日韩精品一区二区 | 91视频久久 | 国产手机在线播放 | 中文字幕999 | 999久久久久久 | 日本精品午夜 | 久久国产精品一二三区 | 久久激情网站 | 在线免费性生活片 | 国产精品九九九九九 | 日韩午夜视频在线观看 | 免费v片 | av成人在线播放 | 天堂网一区二区 | 综合天天色 | 五月天婷婷免费视频 | 亚洲女欲精品久久久久久久18 | www.国产在线观看 | 手机看片99 | 免费亚洲片| 免费在线观看一区 | 在线观影网站 | 久久涩视频 | 少妇超碰在线 | 九九久久久久99精品 | 色婷婷99| 热99在线视频 | 18性欧美xxxⅹ性满足 | 综合伊人久久 | 久久综合久久伊人 | 草久久影院 | 中文字幕日韩在线播放 | 精品欧美日韩 | av成人在线播放 | 99精品视频在线观看视频 | 国产婷婷色| 亚洲精品66 | 国产一级做a爱片久久毛片a | 97视频中文字幕 | 韩日精品在线 | 91av电影| 成年人免费av网站 | 91九色精品女同系列 | 国产欧美久久久精品影院 | 日韩精品一区二区三区第95 | 91看片在线看片 | 黄色av观看 | 在线看v片 | 91精品在线免费观看 | 色吊丝在线永久观看最新版本 | 国产视频一| 99精品视频中文字幕 | 少妇高潮冒白浆 | 亚洲电影黄色 | 国产a视频免费观看 | 欧美淫视频 | 欧美韩日精品 | 麻豆小视频在线观看 | 国产精品毛片一区视频播不卡 | 亚洲激情一区二区三区 | 综合色影院 | 国产精品电影在线 | 欧美日韩免费视频 | 国产69精品久久99不卡的观看体验 | 亚洲一区二区麻豆 | 丁香六月婷| 一二三四精品 | 中文字幕在线观看网址 | 91视频在线观看免费 | 天天天干天天天操 | 国内揄拍国产精品 | 国产成人黄色在线 | 亚洲一级二级 | 久久婷婷久久 | 国产精品一区二区视频 | 少妇性bbb搡bbb爽爽爽欧美 | 成人午夜性影院 | 香蕉视频在线看 | 天天插天天狠天天透 | 最近高清中文字幕 | 亚洲黄色影院 | 亚洲一区二区精品视频 | 免费看一级 | 日本公妇色中文字幕 | 91看片在线观看 | 99 色 | 国产精品九色 | 中文字幕成人一区 | 日本护士三级少妇三级999 | 欧美一级xxxx | 日韩免费观看高清 | 中文字幕第一页在线vr | 国产日本三级 | 亚洲一区二区天堂 | 欧美日韩天堂 | 久久免费视频网 | 四虎免费在线观看视频 | 日日综合网 | 日韩av中文字幕在线免费观看 | 香蕉久草 | 永久av免费在线观看 | 国产成人福利片 | 久久精品日产第一区二区三区乱码 | 97人人模人人爽人人少妇 | 国产黑丝一区二区三区 | 久久高清视频免费 | 欧美精品在线免费 | 精品国产a| 97在线免费视频 | 99免费视频| 色中色资源站 | 久久精品电影网 | 亚洲人成免费 | 一本大道久久精品懂色aⅴ 五月婷社区 | 夜夜操天天摸 | 免费三级大片 | 久久久久久国产精品亚洲78 | 99热这里只有精品免费 | 亚洲成成品网站 | 久久亚洲精品电影 | 成人久久毛片 | 免费国产亚洲视频 | 日韩免费精品 | 日韩欧美精品在线 | 日本一区二区三区免费观看 | 亚州精品一二三区 | 国产美女黄网站免费 | 久久精品99 | 黄色小网站在线 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 96av麻豆蜜桃一区二区 | 免费观看一级 | 激情欧美一区二区三区免费看 | 一级一级一片免费 | 96国产精品 | 中文字幕在线精品 | 精品久久久久久久久中文字幕 | 久久国产网站 | 五月激情在线 | 99高清视频有精品视频 | 日本一区二区三区视频在线播放 | 久久视频在线观看中文字幕 | 超碰在线观看99 | 中文字幕在线观看av | 青青草视频精品 | 成人免费亚洲 | 日本精品视频一区 | 欧美日韩二区三区 | 日韩网站一区 | 97超碰国产精品女人人人爽 | 久久国产影视 | 91免费试看 | 国产高清免费在线播放 | 欧美日韩精品在线播放 | 国产一级视屏 | 国产一区免费 | 国产婷婷精品av在线 | 成人91av| 婷婷综合亚洲 | 在线免费观看国产视频 | 欧美日韩二区三区 | 国产成人免费高清 | 人人舔人人舔 | 中文字幕国语官网在线视频 | 午夜精品中文字幕 | 91一区啪爱嗯打偷拍欧美 | 久久久国产精品人人片99精片欧美一 | 黄色国产区 | 黄色小网站在线观看 | 97夜夜澡人人爽人人免费 | 中文字幕 在线 一 二 | 三级黄色欧美 | 六月丁香综合 | 国产99自拍 | 日韩三级视频在线观看 | 国产伦理精品一区二区 | 黄污视频大全 | 日日精品 | 欧美日韩久久久 | 99国产精品久久久久久久久久 | 国产精品区免费视频 | 中文字幕免费久久 | 美女黄频视频大全 | 91久久奴性调教 | 99中文字幕 | 久草在线视频免费资源观看 | 亚洲精品视频www | 日韩av电影免费观看 | 国产精品手机视频 | 人人爽人人爽 | 在线有码中文字幕 | 亚洲欧美国产日韩在线观看 | 在线欧美中文字幕 | 久草热视频 | 天天激情 | 亚洲视频免费视频 | 精品成人网 | 国产精品专区在线观看 | 久久视精品| 中文在线中文资源 | 97人人澡人人爽人人模亚洲 | 国产中文在线观看 | 免费三级影片 | 在线观看视频免费播放 | 黄视频色网站 | av先锋影音少妇 | 国产又粗又猛又黄又爽的视频 | 96精品视频| www蜜桃视频 | 国产日韩在线一区 | 亚洲国产精品免费 | 中文字幕乱码日本亚洲一区二区 | 久久99精品久久久久久久久久久久 | a视频在线观看免费 | 国产精品99久久久久久大便 | 久久久免费精品 | av一区在线| 久久99久久久久久 | a精品视频| 欧美a在线免费观看 | 久久久国产电影 | 亚洲视频久久久久 | 在线观看黄网站 | 国产精品丝袜 | 九九视频一区 | 国产亚洲欧美在线视频 | 成年人app网址| 中文字幕免| 香蕉精品视频在线观看 | 午夜视频在线观看一区二区三区 | 欧美日韩一区二区三区不卡 | 欧美一区二区三区在线看 | 日日夜夜天天干 | 久久影视一区二区 | 亚洲jizzjizz日本少妇 | 狠狠狠狠干 | 4p变态网欧美系列 | 99视频在线免费播放 | 成人一区二区在线观看 | 黄色av免费看| 国色综合| 一区二区三区精品久久久 | 国产精品一区二区三区久久 | av网站手机在线观看 | 国产网红在线观看 | 成人三级av| 成人亚洲精品久久久久 | 热久久免费视频 | 久久人人爽人人爽 | 国产高清在线视频 | 国产一区二区在线观看视频 | 久久久久亚洲国产精品 | 色综合久久久久网 | 中文字幕在线免费观看 | 毛片1000部免费看 | 日韩欧美极品 | 日本久久成人中文字幕电影 | 97精品国产97久久久久久 | 91黄色影视 | av线上看| 最近日本韩国中文字幕 | 免费黄色网址网站 | 插插插色综合 | 99爱国产精品 | 又黄又爽又刺激 | 天天射天天干天天操 | 中文在线免费视频 | 久久久久 | 天天摸日日操 | 国产视频 亚洲精品 | 成年性视频 | 国产群p视频 | 欧美 国产 视频 | 久久久伦理 | 91精品国产成 | 国产精品6 | 成人在线一区二区三区 | 美女视频又黄又免费 | 久久久蜜桃一区二区 | 色综合久久综合网 | 国产精品影音先锋 | 99久久www | 国产福利资源 | 毛片二区| 天天操天天射天天插 | 91成人欧美 | 在线色视频小说 | 国产91粉嫩白浆在线观看 | 最近中文字幕免费大全 | 伊人五月综合 | 97超碰超碰久久福利超碰 | 丁香婷婷久久久综合精品国产 | 一级一片免费观看 | 天堂在线一区二区 | 欧美亚洲精品一区 | 国产一级片免费观看 | 97色婷婷| 久久综合免费视频影院 | 欧美在线91 | 午夜精品视频在线 | 免费av观看 | 亚洲欧美日本国产 | 日本不卡一区二区三区在线观看 | 国产一级高清 | 成人永久免费 | 五月天网页 | 玖玖999| 午夜国产一区二区 | 久久国产成人午夜av影院潦草 | 亚洲欧美综合精品久久成人 | 久草影视在线观看 | 一区二区精| 欧美成人中文字幕 | 午夜精品999 | 亚洲国产精品999 | 久草视频一区 | 亚洲欧美国产精品va在线观看 | 久久免费电影 | 又黄又爽的免费高潮视频 | 久久婷婷激情 | 黄av免费 | av在线免费观看网站 | 久久激情五月激情 | 亚洲精品短视频 | 草 免费视频 | 欧美日韩在线观看视频 | 操操操av | 免费看黄色毛片 | 欧美视频18 | 精品99久久久久久 | 亚洲网久久 | 国产中文字幕视频在线观看 | 深爱激情综合网 | 亚洲日本va午夜在线影院 | 欧美日韩aaaa | 欧美激情视频久久 | 精品1区2区3区 | 92中文资源在线 | 最近中文字幕大全中文字幕免费 | 亚洲最新av | 国产 在线观看 | 色就是色综合 | 亚洲精品小视频在线观看 | www.97视频 | 国产九九热视频 | 婷婷国产精品 | 精品中文字幕在线播放 | 视频在线一区二区三区 | 久九视频 | 亚洲精品18p | 7777精品伊人久久久大香线蕉 | 久久99深爱久久99精品 | 91精品老司机久久一区啪 | 欧美一二三四在线 | 91精品国产91 | 欧美午夜视频在线 | 亚洲三级性片 | 最近能播放的中文字幕 | 成人国产精品 | 97成人在线观看视频 | 亚洲不卡在线 | 日本三级中文字幕在线观看 | 国产成人在线播放 | 国产一级大片免费看 | 一区中文字幕电影 | 久久99精品久久久久久久久久久久 | 久久精品国产免费观看 | 国产一级在线观看视频 | 97视频免费在线观看 | 日韩精品一区二区在线观看 | 国产精品不卡在线播放 | 国产精品一区在线播放 | 我要色综合天天 | 四季av综合网站 | 国产精品麻豆果冻传媒在线播放 | 一区二区三区日韩在线 | 日韩欧美精品在线 | 国产性天天综合网 | 欧美性天天 | 国产视频97| 国产成人精品av久久 | 激情视频免费在线观看 | 综合激情网 | 五月天网站在线 | 欧美福利精品 | 国产成人a亚洲精品v | 91视频免费网址 | 国模精品一区二区三区 | 日韩在线无 | 99这里只有精品视频 | 色七七亚洲影院 | 精品国产一区在线观看 | www色网站 | 亚洲综合日韩在线 | 丁香视频全集免费观看 | 99精品视频免费全部在线 | 在线免费视频 你懂得 | 手机看片中文字幕 | 久久成视频 | 亚洲综合精品视频 | 亚洲高清网站 | 日本久久久久久 | 在线观看免费视频你懂的 | 亚洲国产日韩在线 | 中文字幕在线观看91 | 美女网站色 | 亚洲精品在线免费 | 亚洲国产日韩欧美 | 亚洲日本在线一区 | 日韩欧美一区二区三区黑寡妇 | 国产成人香蕉 | 美女视频黄在线 | 久久精国产| 亚洲精品视频免费观看 | 黄色国产大片 | 久久免费视频精品 | 久久艹精品| av在线最新| av一级网站| 天天射天天干天天插 | 免费激情网 | 日韩精品一区二区三区高清免费 | 综合精品在线 | 亚洲成人免费在线观看 | 亚洲va欧美va人人爽 | 亚洲资源一区 | 久久久综合电影 | 夜夜躁日日躁狠狠久久88av | 91成人免费观看视频 | 久久久久亚洲国产精品 | 区一区二区三区中文字幕 | 91精品婷婷国产综合久久蝌蚪 | 九九涩涩av台湾日本热热 | 81国产精品久久久久久久久久 | 日韩在线观看第一页 | 97人人射| 国产黄在线观看 | 亚洲丁香日韩 | 激情综合网天天干 | 久久这里只有精品1 | 91精品啪在线观看国产81旧版 | 久久99精品久久久久久久久久久久 | 国产又粗又猛又黄又爽 | www.xxxx欧美 | 最新色站 | 91精品久久久久久久久久入口 | 久草在线视频首页 | 色婷婷综合久久久中文字幕 | www.亚洲黄| 亚洲综合色网站 | 亚洲精品午夜视频 | 日韩性色 | 日女人电影 | 国产精品成人av电影 | av资源中文字幕 | 日本三级中文字幕在线观看 | 天堂av在线 | www.97色.com| 久久人人97超碰国产公开结果 | 天天射天天操天天干 | 国产麻豆精品免费视频 | 五月婷社区 | 久久蜜桃av| 干干干操操操 | www.xxxx变态.com | 欧美日韩精品在线观看视频 | 97超碰在线久草超碰在线观看 | 欧美一区二区免费在线观看 | av电影中文字幕在线观看 | 天天插天天狠天天透 | 久久精品综合一区 | 高清国产在线一区 | 88av网站 | 国产美女黄网站免费 | 丝袜制服天堂 | 天天艹日日干 | 九九九九九九精品任你躁 | 黄色亚洲精品 | 国产一级二级三级视频 | 久草视频在线资源 | 亚洲精品综合欧美二区变态 | 精品欧美一区二区三区久久久 | 一区二区三区不卡在线 | 五月婷婷色丁香 | 国产精品露脸在线 | av片中文| 99热国产在线观看 | 香蕉久久久久久久 | 中文字幕视频在线播放 | 狠狠色丁香婷综合久久 | 国产中文字幕精品 | 中文字幕在线视频一区 | 亚洲精品国产精品国产 | 久久久首页 | 国产亚洲精品久久网站 | 99久久精品国产欧美主题曲 | 日本黄色大片免费 | 中文区中文字幕免费看 | 精品v亚洲v欧美v高清v | 一级欧美一级日韩 | 国产精品久久久久四虎 | 欧美性色黄大片在线观看 | 久久国产成人午夜av影院潦草 | 久久久精品一区二区 | 日本成人免费在线观看 | 91亚洲精品久久久蜜桃 | 国产手机在线 | 色噜噜在线观看视频 | 毛片www| 91福利影院在线观看 | 精品国产免费久久 | 免费在线观看av网站 | 久久国精品 | 久久久久综合精品福利啪啪 | 久久视频这里只有精品 | 精品国产伦一区二区三区观看体验 | 99欧美精品 | 国产精品va在线 | 91精品久久久久久久久久入口 | 国产精品免费av | 欧美a级片免费看 | 97在线观看免费观看 | 久插视频 | 狠狠成人 | 久草在线视频首页 | 精品国产成人av在线免 | 天天干,天天射,天天操,天天摸 | 中文久草 | 中国老女人日b | 欧美在线1| 亚洲激情久久 | 国产福利小视频在线 | 欧美巨乳波霸 | 成人免费在线电影 | 婷婷精品在线视频 | 久久久免费国产 | av在线小说 | av观看免费在线 | 国产精品一区二区美女视频免费看 | 97成人在线| 国产永久免费高清在线观看视频 | 黄色精品一区二区 | 麻豆传媒视频在线免费观看 | 久久视频在线 | 六月婷色 | av九九九 | 夜夜操天天摸 | 天天摸天天舔天天操 | 伊人亚洲综合 | 精品国自产在线观看 | 成人超碰在线 | 蜜桃视频在线观看一区 | 成人在线播放视频 | 久久国产热视频 | 91网免费看 | 国产精品私人影院 | 最近中文字幕国语免费高清6 | 成人久久精品视频 | 成人免费一级片 | 国产一区二区电影在线观看 | 日韩免费一区二区三区 | www.com.日本一级| 国产淫片 | 日韩一区二区免费在线观看 | 久久三级毛片 | 69av在线播放 | 国产黄大片在线观看 | 久久少妇免费视频 | 久久久久国产一区二区三区四区 | 在线观看国产成人av片 | 伊人久久国产精品 | 色福利网 | 最新99热 | 91亚洲精品久久久 | 国产一级在线观看视频 | 国产手机免费视频 | 天天插综合 | www.国产高清 | 在线精品视频免费播放 | 日日爱视频 | 久久99久久99精品免观看粉嫩 | 97av免费视频 | 日本久久高清视频 | 日韩精品一区二区三区电影 | 日韩在线观看你懂的 | 成人在线观看你懂的 | 久久精品91久久久久久再现 | 国产91九色蝌蚪 | 精品久久精品 | 国产又黄又爽又猛视频日本 | 日批在线观看 | 午夜久久久久 | 婷婷亚洲综合 | 国产视频资源在线观看 | 久久久久久久久久久久久久电影 | 国产色在线 | 4438全国亚洲精品观看视频 | 国产伦精品一区二区三区照片91 | 人人澡视频 | 中文视频在线看 | 四虎国产视频 | 永久免费精品视频 | 涩涩网站在线播放 | 欧美精品久久人人躁人人爽 | 国产99久久久精品视频 | 成人午夜剧场在线观看 | 天天操夜夜操夜夜操 | 国产 字幕 制服 中文 在线 | 日韩毛片在线免费观看 | 午夜影院日本 | 久久精品一区二区三区中文字幕 | 亚洲激情婷婷 | 中文字幕网站 | 亚洲91精品| 亚洲码国产日韩欧美高潮在线播放 | 91资源在线观看 | 久久色视频 | 激情影院在线 | 久久久国产在线视频 | 片网站| 色视频在线 | 国产精品久久久久一区二区国产 | 奇米影视8888在线观看大全免费 | 久久激情精品 | 国产精品久久一 | 国产成人精品一区二区在线 | 国产精品久久电影网 | 麻豆免费在线视频 | 亚洲综合日韩在线 | 狠狠精品 | 亚州精品一二三区 | 国产v在线观看 | 久久午夜色播影院免费高清 | 国产日产精品一区二区三区四区 | 国产精品久久综合 | 国产精品成久久久久三级 | 2019天天干天天色 | 久久久久国产一区二区三区四区 | 国产在线看一区 | 久久久久久久久久久久av | 亚洲精品黄色片 | 天天天色综合 | 午夜精品一区二区三区在线 | 欧美日韩成人 | 日韩在线第一 | 久久久网址 | 超碰国产人人 | 99精品欧美一区二区三区 | 成人黄色电影在线观看 | 色在线中文字幕 | 成人免费观看大片 | 欧美 激情在线 | 夜夜躁狠狠躁日日躁视频黑人 | 亚洲视频 中文字幕 | 久久免费片 | 中文字幕视频三区 | 欧美嫩草影院 | japanesexxx乱女另类 | 99久久精品久久久久久动态片 | 日本久久精品 | 亚洲国产精品视频在线观看 | 日韩精品视频在线免费观看 | 蜜臀久久99精品久久久无需会员 | 亚洲专区视频在线观看 | 欧美伦理电影一区二区 | 婷婷午夜天 | 日日夜夜添 | 久久经典国产视频 | 波多野结衣亚洲一区二区 | 亚洲精品在线资源 | 国产视频精选 | 国产香蕉久久精品综合网 | 国产成人精品在线播放 | 亚洲精品午夜久久久久久久 | 天天搞天天 | 丁香婷五月 | 爱爱av在线 | 国产在线观看中文字幕 | 国产在线v| 999视频网站 | 欧美国产91 | 久久久久国产精品一区二区 | 欧美日韩69 | 国产精品美女在线 | 免费看片成年人 | 欧美va电影 | 国产小视频福利在线 | 中文在线字幕免费观看 | 国产精品午夜av | 国产精品18久久久久白浆 | 亚洲国产理论片 | 免费av黄色 | 日批视频国产 | 日韩免费看视频 | 日日爽 | 国产小视频在线免费观看视频 | 欧美日韩精品二区第二页 | 91精品欧美 | 99热精品在线观看 | 中文字幕在线观看av | 久久久久亚洲精品男人的天堂 | 亚洲在线 | 蜜桃视频精品 | 婷婷丁香综合 | 又色又爽又黄高潮的免费视频 | 天天拍天天草 | 亚洲妇女av | av在线免费网站 | 亚洲高清免费在线 | 狠狠88综合久久久久综合网 | 天天爽天天做 | 国产69精品久久久久99尤 | 久久专区| 日韩av手机在线看 | 亚洲欧美日韩国产一区二区三区 | 日韩免费观看视频 | 四虎在线观看 | 天天性天天草 | 精品国产伦一区二区三区观看方式 | 免费在线观看av网站 | www.久久久精品 | 亚洲精品综合欧美二区变态 | 91色一区二区三区 | 曰本三级在线 | 在线看的av网站 | 国产精品爽爽久久久久久蜜臀 | 久久久久看片 | 国产精品毛片一区 | 成人免费视频视频在线观看 免费 | 久久综合狠狠综合 | 日韩午夜小视频 | 日韩一区在线播放 | 欧美激情视频在线观看免费 | 久久久国产网站 | 99视屏 | 日韩av影片在线观看 | 国内久久精品 | www夜夜| 国产视频999 | 亚洲91视频| 欧美成人中文字幕 | 亚洲国产成人在线 | 激情综合五月网 | 色欧美视频 | 麻豆影视网站 | 麻豆传媒在线视频 | 国产一区免费在线 | 中文字幕日本特黄aa毛片 | 亚洲精品福利在线 | www.天天色.com| 亚洲欧美在线视频免费 | 青草视频在线免费 | 欧美日韩高清 | 国产午夜影院 | 香蕉影院在线播放 | 国产高清在线a视频大全 | 在线a人片免费观看视频 | 欧美a级在线 | 国产精品五月天 | 日韩久久精品一区二区 | 99在线视频精品 | 婷婷久久国产 | 国产精品伦一区二区三区视频 | 久久久免费精品国产一区二区 | 天天操天天舔天天爽 | 久久国产精品久久久 | 久草久热 | 黄色网在线播放 | 日韩欧美一区二区三区在线观看 | 又长又大又黑又粗欧美 | 国产一区二区三区久久久 | 不卡视频一区二区三区 | 国产香蕉视频在线观看 | 欧美黑人xxxx猛性大交 | 91人人澡| 精品久久久久久国产偷窥 | 人人操日日干 | 国产一区二区三区免费在线观看 | 99国产在线| 久久久精品国产一区二区 | 久久不射电影网 | 91麻豆产精品久久久久久 | 欧美日韩视频一区二区三区 | 亚洲欧美视频在线 | 黄色三级在线 | 美腿丝袜一区二区三区 | 久久激五月天综合精品 | 国产精品久久久久久欧美 | 天天爱天天操天天干 | 在线免费精品视频 | 日本久久久久 | 免费a现在观看 | 久草视频在线免费看 | 亚洲另类xxxx | 亚洲国产欧美在线人成大黄瓜 | 99精品在线直播 | 激情五月六月婷婷 | 美女精品在线 | 中文av字幕在线观看 | 韩日精品中文字幕 | 中文字幕电影高清在线观看 | 在线 成人 | 精品国产乱码久久久久久浪潮 | 狠狠干网站| 久草在线网址 | 97在线精品国自产拍中文 | 日本黄色免费大片 | 五月婷婷在线综合 | 久久电影网站中文字幕 | 久久久久久久久久久久av | 激情av资源 | 草久在线视频 | 欧美性色综合网 | 国产视频一区在线播放 | 99人久久精品视频最新地址 | 欧美三级在线播放 | 精品久久91 | 四虎影视精品永久在线观看 | 视频在线观看国产 | 97视频人人 | 四虎免费在线观看视频 | 国产黄色一级片在线 | 日日碰狠狠添天天爽超碰97久久 | www91在线| 日韩福利在线观看 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 四虎在线观看精品视频 | 日韩一区正在播放 | 91香蕉视频色版 | 91精选在线观看 | 欧美日本一二三 | 国产亚洲人| 91精品在线免费观看 | www.五月激情.com | 国产激情小视频在线观看 | 中文免费| 深爱五月激情五月 | 麻豆免费精品视频 | 九色福利视频 | 中文有码在线视频 | 欧美一级裸体视频 | 丁香六月久久综合狠狠色 | 黄色小说视频网站 | 亚洲精品视频 | 91丨九色丨蝌蚪丨对白 | 韩国av一区二区 | 国产午夜精品一区二区三区在线观看 | 热久久在线视频 | 四虎国产精品成人免费影视 | 国产精品黄色在线观看 | 日韩中文字幕视频在线观看 | av大全在线免费观看 | 国产人成看黄久久久久久久久 | 中文字幕免费在线看 | 亚洲精品a区 | 国产中文字幕网 | 久久96国产精品久久99漫画 | 狠狠色噜噜狠狠狠合久 | 久久久久精 | 综合网天天色 | 婷婷丁香激情综合 | 日韩欧美在线高清 | 欧美日韩精品在线视频 | 中文字幕在线影院 | 欧美射射射 | 一区二区三区中文字幕在线 | 91精品国产麻豆国产自产影视 | 久久99精品久久久久久三级 | 日韩精品一区在线播放 | 日韩理论在线观看 | 天天操婷婷 | 欧美伦理一区二区 | 亚洲伊人婷婷 | 视频在线99re| 手机在线看片日韩 | 99久久综合国产精品二区 | 国内精品久久久久影院男同志 | 91av手机在线 | 国产一区在线精品 | 成人免费视频在线观看 | 久久超碰网| 日韩1页| 欧美一区二区在线看 | 四虎国产免费 | 中文在线字幕观看电影 | 精品国产一区二区三区男人吃奶 | 日日爱网站 | 一级黄色在线视频 | 91女人18片女毛片60分钟 | 麻豆一精品传二传媒短视频 | 激情综合五月天 | 日本一区二区三区免费观看 | 九九在线高清精品视频 | av+在线播放在线播放 | 欧美日本国产在线观看 | 日韩精品一区二区三区中文字幕 | 久久夜色精品国产欧美乱极品 | 91天堂素人约啪 | 91高清视频在线 | 亚州精品成人 | 99爱视频在线观看 | 九色视频网站 | 一级黄色片网站 | 久久精品久久精品久久39 | 99精品国产福利在线观看免费 | 中文字幕色在线视频 | 激情六月婷婷久久 | 97成人精品视频在线观看 | 日韩电影一区二区在线观看 | 97狠狠操 | 久久国产精品成人免费浪潮 | 瑞典xxxx性hd极品 | 少妇bbb搡bbbb搡bbbb′ | 手机成人av| 在线中文字幕电影 | 久热色超碰 | 亚洲午夜精品久久久久久久久 | 国产精品18毛片一区二区 | 99在线观看 | 最新真实国产在线视频 | 日本女人逼 | 亚洲精品国产精品国自产 | 久草在| 在线免费黄色 | 在线视频 国产 日韩 | av黄色成人 | 在线观看mv的中文字幕网站 | 日韩高清不卡一区二区三区 | 天天射一射 | 伊人中文字幕在线 | 久久好看免费视频 | 国产精品久久久久久久久久尿 | 三级av片 | 免费网站看av片 | 国产成人精品一区二区三区网站观看 | 久久免费成人精品视频 | 黄色大全免费网站 | 美女免费视频观看网站 | 亚洲国产中文字幕在线 | 狠狠狠狠狠狠操 | 激情综合久久 | 人人舔人人射 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 久久成人精品视频 | 91av欧美| 日韩 在线观看 | 亚洲精品视频播放 | 丁香av| 免费久久久久久久 | 五月婷婷综合在线视频 | 久久99精品久久久久久久久久久久 | 美女视频黄的免费的 | 久久成人午夜 | 日韩免费高清 | 国产色a在线观看 | 天天插日日操 | 久久久久女人精品毛片 | 99精品黄色片免费大全 | 69国产成人综合久久精品欧美 | 日韩中文在线电影 | 97在线看 | 亚洲久草视频 | 中文在线免费看视频 | 操夜夜操 | 久在线| 97超碰免费 | 在线精品视频免费播放 | 成人黄色电影免费观看 | 在线观看亚洲电影 | 国产在线观看免费观看 | 五月婷香蕉久色在线看 | 国产成人精品女人久久久 | 2019精品手机国产品在线 | 亚洲色图22p| 极品久久久 | 91亚洲影院 | 国产成人久久av977小说 |