Struts2.2+Spring3.1+Hibernate3.6整合(登錄示例及CRUD操作)

一 運行環境: XP3+Myeclipse6.6+Tomcat7
二 項目框架版本號:Struts2 version: 2.2.1.1,Spring version: 3.1,Hibernate version:3.6,在Hibernate下有個jar爲:javassist-3.12.0.GA.jar,在這個示例中用的是:javassist-3.7.ga.jar,這二個在這個示例中都可以用,沒問題,一般原則用新版本的
項目所用jar文件如下圖

三 具體實現如下:

1 配置文件:

Web.xml

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"  
  3.  xmlns="http://java.sun.com/xml/ns/j2ee"  
  4.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
  6.  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.   
  8.     <context-param>  
  9.       <param-name>webAppRootKey</param-name>  
  10.       <param-value>s2sh.root</param-value>  
  11.      </context-param>  
  12.   
  13.     <context-param>  
  14.         <param-name>  
  15.             contextConfigLocation   
  16.         </param-name>  
  17.         <param-value>  
  18.             classpath*:applicationContext.xml   
  19.         </param-value>  
  20.     </context-param>  
  21.        
  22.     <context-param>  
  23.        <param-name>log4jConfigLocation</param-name>  
  24.        <param-value>/WEB-INF/classes/log4j.properties</param-value>  
  25.     </context-param>    
  26.        
  27.      <context-param>  
  28.       <param-name>log4jRefreshInterval</param-name>  
  29.       <param-value>60000</param-value>  
  30.      </context-param>    
  31.      <context-param>  
  32.         <param-name>log4jExposeWebAppRoot</param-name>  
  33.         <param-value>false</param-value>  
  34.     </context-param>  
  35.        
  36.     <listener>  
  37.         <listener-class>  
  38.             org.springframework.web.context.ContextLoaderListener   
  39.         </listener-class>  
  40.     </listener>      
  41.        
  42.     <listener>  
  43.        <listener-class>  
  44.             org.springframework.web.util.Log4jConfigListener   
  45.        </listener-class>  
  46.     </listener>        
  47.        
  48.     <filter>  
  49.         <filter-name>  
  50.             encodingFilter   
  51.         </filter-name>  
  52.         <filter-class>  
  53.             org.springframework.web.filter.CharacterEncodingFilter   
  54.         </filter-class>  
  55.         <init-param>  
  56.             <param-name>  
  57.                 encoding   
  58.             </param-name>  
  59.             <param-value>  
  60.                 UTF-8   
  61.             </param-value>  
  62.         </init-param>  
  63.     </filter>  
  64.        
  65.     <filter-mapping>  
  66.         <filter-name>  
  67.             encodingFilter   
  68.         </filter-name>  
  69.         <url-pattern>  
  70.             /*   
  71.         </url-pattern>  
  72.     </filter-mapping>  
  73.        
  74.     <filter>  
  75.         <filter-name>  
  76.             openSessionInView   
  77.         </filter-name>  
  78.         <filter-class>  
  79.             org.springframework.orm.hibernate3.support.OpenSessionInViewFilter   
  80.         </filter-class>  
  81.     </filter>  
  82.        
  83.     <filter-mapping>  
  84.         <filter-name>  
  85.             openSessionInView   
  86.         </filter-name>  
  87.         <url-pattern>  
  88.             /*   
  89.         </url-pattern>  
  90.     </filter-mapping>  
  91.        
  92.        
  93.     <filter>  
  94.         <filter-name>  
  95.             struts2   
  96.         </filter-name>  
  97.         <filter-class>  
  98.             org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter   
  99.         </filter-class>  
  100.     </filter>  
  101.        
  102.     <filter-mapping>  
  103.         <filter-name>  
  104.             struts2   
  105.         </filter-name>  
  106.         <url-pattern>  
  107.             /*   
  108.         </url-pattern>  
  109.     </filter-mapping>  
  110.        
  111.     <welcome-file-list>  
  112.         <welcome-file>  
  113.             index.jsp   
  114.         </welcome-file>  
  115.     </welcome-file-list>  
  116. </web-app>  
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
 xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<context-param>
	  <param-name>webAppRootKey</param-name>
	  <param-value>s2sh.root</param-value>
	 </context-param>

    <context-param>
        <param-name>
            contextConfigLocation
        </param-name>
        <param-value>
            classpath*:applicationContext.xml
        </param-value>
    </context-param>
	
	<context-param>
	   <param-name>log4jConfigLocation</param-name>
	   <param-value>/WEB-INF/classes/log4j.properties</param-value>
	</context-param> 
	
	 <context-param>
	  <param-name>log4jRefreshInterval</param-name>
	  <param-value>60000</param-value>
	 </context-param>	
	 <context-param>
		<param-name>log4jExposeWebAppRoot</param-name>
		<param-value>false</param-value>
	</context-param>
	
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>	
	
	<listener>
	   <listener-class>
			org.springframework.web.util.Log4jConfigListener
	   </listener-class>
	</listener>     
    
    <filter>
        <filter-name>
            encodingFilter
        </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>
            encodingFilter
        </filter-name>
        <url-pattern>
            /*
        </url-pattern>
    </filter-mapping>
    
    <filter>
        <filter-name>
            openSessionInView
        </filter-name>
        <filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>
            openSessionInView
        </filter-name>
        <url-pattern>
            /*
        </url-pattern>
    </filter-mapping>
    
    
    <filter>
        <filter-name>
            struts2
        </filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>
            struts2
        </filter-name>
        <url-pattern>
            /*
        </url-pattern>
    </filter-mapping>
    
    <welcome-file-list>
        <welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>



Struts2.xml文件如下:

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC   
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">         
  5. <struts>  
  6.     <package name="user" extends="struts-default">  
  7.         <action name="userAction" class="u">  
  8.             <result name="success">success.jsp</result>  
  9.             <result name="userList">userList.jsp</result>  
  10.             <result name="fail">fail.jsp</result>  
  11.             <result name="user">user.jsp</result>  
  12.         </action>    
  13.     </package>       
  14. </struts>  
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">    	
<struts>
    <package name="user" extends="struts-default">
        <action name="userAction" class="u">
            <result name="success">success.jsp</result>
			<result name="userList">userList.jsp</result>
			<result name="fail">fail.jsp</result>
			<result name="user">user.jsp</result>
        </action>	
    </package>	
</struts>



applicationContext.xml配置文件如下:

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  9.            http://www.springframework.org/schema/context   
  10.            http://www.springframework.org/schema/context/spring-context-3.0.xsd   
  11.            http://www.springframework.org/schema/aop   
  12.            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
  13.            http://www.springframework.org/schema/tx    
  14.            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  15.               
  16.     <context:annotation-config />  
  17.     <context:component-scan base-package="com.liuzd.s2sh" />  
  18.   
  19.     <bean  
  20.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  21.         <property name="locations">  
  22.             <value>classpath:jdbc.properties</value>  
  23.         </property>  
  24.     </bean>  
  25.   
  26.     <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">  
  27.         <property name="driverClassName"  
  28.             value="${jdbc.driverClassName}" />  
  29.         <property name="url" value="${jdbc.url}" />  
  30.         <property name="username" value="${jdbc.username}" />  
  31.         <property name="password" value="${jdbc.password}" />  
  32.     </bean>  
  33.        
  34.        
  35.   
  36.     <bean id="sessionFactory"  
  37.         class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  38.         <property name="dataSource" ref="dataSource" />          
  39.          <property name="packagesToScan">  
  40.             <list>  
  41.                 <value>com.liuzd.s2sh.entity</value>                   
  42.             </list>  
  43.         </property>  
  44.         <property name="hibernateProperties">  
  45.             <props>  
  46.                 <prop key="hibernate.dialect">  
  47.                     org.hibernate.dialect.Oracle10gDialect   
  48.                 </prop>  
  49.                 <prop key="hibernate.show_sql">true</prop>  
  50.                 <prop key="format_sql">true</prop>  
  51.             </props>  
  52.         </property>  
  53.     </bean>  
  54.        
  55.     <!-- 讓spring管理sessionFactory的加一種方法 ,就是不刪除hibernate.cfg.xml文件;   
  56.      <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  57.       <property name="configLocation">  
  58.        <value>classpath:hibernate.cfg.xml</value>  
  59.       </property>  
  60.      </bean>  
  61.     -->    
  62.        
  63.     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">  
  64.         <property name="sessionFactory" ref="sessionFactory"></property>  
  65.     </bean>  
  66.        
  67.     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  68.        <property name="dataSource" ref="dataSource"></property>  
  69.   
  70. </bean>  
  71.   
  72.     <bean id="txManager"  
  73.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  74.         <property name="sessionFactory" ref="sessionFactory" />  
  75.     </bean>  
  76.   
  77.     <aop:config>  
  78.         <aop:pointcut id="bussinessService"  
  79.             expression="execution(public * com.liuzd.s2sh.service.*.*(..))" />  
  80.         <aop:advisor pointcut-ref="bussinessService"  
  81.             advice-ref="txAdvice" />  
  82.     </aop:config>  
  83.   
  84.     <tx:advice id="txAdvice" transaction-manager="txManager">  
  85.         <tx:attributes>  
  86.             <tx:method name="*" />     
  87.             <tx:method name="add*" propagation="REQUIRED"/>  
  88.             <tx:method name="del*" propagation="REQUIRED"/>  
  89.             <tx:method name="edit*" propagation="REQUIRED"/>  
  90.         </tx:attributes>  
  91.     </tx:advice>  
  92. </beans>  
<?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: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-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
           
	<context:annotation-config />
	<context:component-scan base-package="com.liuzd.s2sh" />

	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<value>classpath:jdbc.properties</value>
		</property>
	</bean>

	<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
	
	

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />		
		 <property name="packagesToScan">
			<list>
				<value>com.liuzd.s2sh.entity</value>				
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.Oracle10gDialect
				</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="format_sql">true</prop>
			</props>
		</property>
	</bean>
	
	<!-- 讓spring管理sessionFactory的加一種方法 ,就是不刪除hibernate.cfg.xml文件;
	 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	  <property name="configLocation">
	   <value>classpath:hibernate.cfg.xml</value>
	  </property>
	 </bean>
	--> 
	
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
       <property name="dataSource" ref="dataSource"></property>

</bean>

	<bean id="txManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<aop:config>
		<aop:pointcut id="bussinessService"
			expression="execution(public * com.liuzd.s2sh.service.*.*(..))" />
		<aop:advisor pointcut-ref="bussinessService"
			advice-ref="txAdvice" />
	</aop:config>

	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="*" />  
			<tx:method name="add*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED"/>
			<tx:method name="edit*" propagation="REQUIRED"/>
		</tx:attributes>
	</tx:advice>
</beans>


jdbc.properties屬性文件如下:

Properties代碼 複製代碼 收藏代碼
  1. jdbc.driverClassName=oracle.jdbc.driver.OracleDriver   
  2. jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl   
  3. jdbc.username=liuzd   
  4. jdbc.password=liuzd  
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc.username=liuzd
jdbc.password=liuzd


log4j.properties屬性文件如下:

Properties代碼 複製代碼 收藏代碼
  1. log4j.appender.stdout=org.apache.log4j.ConsoleAppender   
  2. log4j.appender.stdout.Target=System.out   
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout   
  4. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n   
  5. log4j.appender.db=org.apache.log4j.FileAppender   
  6. log4j.appender.db.File=${s2sh.root}/WEB-INF/logs/ssh.log   
  7. log4j.appender.db.Append=true   
  8. log4j.appender.db.layout=org.apache.log4j.PatternLayout   
  9. log4j.appender.db.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.db=org.apache.log4j.FileAppender
log4j.appender.db.File=${s2sh.root}/WEB-INF/logs/ssh.log
log4j.appender.db.Append=true
log4j.appender.db.layout=org.apache.log4j.PatternLayout
log4j.appender.db.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p][%c{1}] - %m%n


2 Java代碼如下:
A WEB層:
BaseAction Code:

Java代碼 複製代碼 收藏代碼
  1. import java.util.Map;   
  2.   
  3. import javax.servlet.http.HttpServletRequest;   
  4.   
  5. import org.apache.struts2.ServletActionContext;   
  6. import org.apache.struts2.interceptor.SessionAware;   
  7.   
  8. import com.opensymphony.xwork2.ActionContext;   
  9. import com.opensymphony.xwork2.ActionSupport;   
  10.   
  11. public class BaseAction extends ActionSupport implements SessionAware{   
  12.        
  13.     private static final long serialVersionUID = 1L;   
  14.   
  15.     public void setSession(Map<String, Object> sessionMap) {         
  16.            
  17.     }      
  18.        
  19.     protected Map<String,Object> getSession(){   
  20.         return  (Map<String,Object>)ActionContext.getContext().getSession();   
  21.     }   
  22.        
  23.     protected HttpServletRequest getRequest(){   
  24.         return ServletActionContext.getRequest ();    
  25.     }   
  26. }  
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport implements SessionAware{
	
	private static final long serialVersionUID = 1L;

	public void setSession(Map<String, Object> sessionMap) {		
		
	}	
	
	protected Map<String,Object> getSession(){
		return  (Map<String,Object>)ActionContext.getContext().getSession();
	}
	
	protected HttpServletRequest getRequest(){
		return ServletActionContext.getRequest (); 
	}
}



UserAction Code:

Java代碼 複製代碼 收藏代碼
  1. import java.util.List;   
  2.   
  3. import javax.annotation.Resource;   
  4.   
  5. import org.springframework.context.annotation.Scope;   
  6. import org.springframework.stereotype.Component;   
  7.   
  8. import com.liuzd.s2sh.entity.User;   
  9. import com.liuzd.s2sh.service.UserService;   
  10.   
  11. @Component("u")   
  12. @Scope("prototype")   
  13. public class UserAction extends BaseAction {   
  14.   
  15.     private static final long serialVersionUID = 1L;   
  16.   
  17.     private UserService userService = null;   
  18.     private String message = null;   
  19.   
  20.     private User user = null;   
  21.        
  22.     private String action = null;   
  23.   
  24.     public String getAction() {   
  25.         return action;   
  26.     }   
  27.   
  28.     public void setAction(String action) {   
  29.         this.action = action;   
  30.     }   
  31.   
  32.     public User getUser() {   
  33.         return user;   
  34.     }   
  35.   
  36.     public void setUser(User user) {   
  37.         this.user = user;   
  38.     }   
  39.   
  40.     @Override  
  41.     public String execute() throws Exception {   
  42.         System.out.println("user: "+user);   
  43.            
  44.         User dbUser = this.userService.checkUserExits(user);   
  45.         if (null != dbUser) {   
  46.             message = "用戶: " + user.getUsername() + "登錄成功";   
  47.             System.out.println(message);   
  48.             getSession().put("sessionUser",dbUser);   
  49.             return userList();   
  50.         }   
  51.         message = "用戶: " + user.getUsername() + "登錄失敗";   
  52.         return "fail";   
  53.     }   
  54.        
  55.     public String loadUser(){   
  56.          action = "update";   
  57.          message = "編輯用戶信息";   
  58.          User loadUser = new User();   
  59.          loadUser.setId(user.getId());   
  60.          user = this.userService.getUserByUid(loadUser);   
  61.          this.getRequest().setAttribute("myname","天涯海角");   
  62.          this.getSession().put("mysex""男");   
  63.          System.out.println("loaduser: "+user);         
  64.          return "user";   
  65.     }   
  66.        
  67.     public String addUser(){   
  68.          action = "add";           
  69.          return "user";   
  70.     }   
  71.        
  72.     public String saveUser(){   
  73.          this.userService.addUser(user);           
  74.          return "user";   
  75.     }   
  76.        
  77.     public String delUser(){       
  78.         action = "del";   
  79.         this.userService.delUser(user);   
  80.         return userList();   
  81.     }   
  82.        
  83.     public String editUser(){   
  84.          System.out.println("action: "+action+",編輯用戶: "+user);   
  85.          if("update".equals(action)){   
  86.            this.userService.editUser(user);   
  87.          }else if("add".equals(action)){   
  88.              saveUser();   
  89.          }   
  90.          return userList();   
  91.     }   
  92.        
  93.     public String userList(){   
  94.          List<User> userList = this.userService.getUserList();   
  95.          System.out.println("usersize: "+userList.size() + ",user: " + userList.get(0));   
  96.          getRequest().setAttribute("userList", userList);   
  97.          return "userList";   
  98.     }   
  99.   
  100.     public UserService getUserService() {   
  101.         return userService;   
  102.     }   
  103.   
  104.     @Resource  
  105.     public void setUserService(UserService userService) {   
  106.         this.userService = userService;   
  107.     }   
  108.   
  109.     public String getMessage() {   
  110.         return message;   
  111.     }   
  112.   
  113.     public void setMessage(String message) {   
  114.         this.message = message;   
  115.     }   
  116.   
  117. }  
import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.liuzd.s2sh.entity.User;
import com.liuzd.s2sh.service.UserService;

@Component("u")
@Scope("prototype")
public class UserAction extends BaseAction {

	private static final long serialVersionUID = 1L;

	private UserService userService = null;
	private String message = null;

	private User user = null;
	
	private String action = null;

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("user: "+user);
		
		User dbUser = this.userService.checkUserExits(user);
		if (null != dbUser) {
			message = "用戶: " + user.getUsername() + "登錄成功";
			System.out.println(message);
			getSession().put("sessionUser",dbUser);
			return userList();
		}
		message = "用戶: " + user.getUsername() + "登錄失敗";
		return "fail";
	}
	
	public String loadUser(){
		 action = "update";
		 message = "編輯用戶信息";
		 User loadUser = new User();
		 loadUser.setId(user.getId());
		 user = this.userService.getUserByUid(loadUser);
		 this.getRequest().setAttribute("myname","天涯海角");
		 this.getSession().put("mysex", "男");
		 System.out.println("loaduser: "+user);		 
		 return "user";
	}
	
	public String addUser(){
		 action = "add";		
		 return "user";
	}
	
	public String saveUser(){
		 this.userService.addUser(user);		
		 return "user";
	}
	
	public String delUser(){	
		action = "del";
		this.userService.delUser(user);
		return userList();
	}
	
	public String editUser(){
		 System.out.println("action: "+action+",編輯用戶: "+user);
		 if("update".equals(action)){
		   this.userService.editUser(user);
		 }else if("add".equals(action)){
			 saveUser();
		 }
		 return userList();
	}
	
	public String userList(){
		 List<User> userList = this.userService.getUserList();
		 System.out.println("usersize: "+userList.size() + ",user: " + userList.get(0));
		 getRequest().setAttribute("userList", userList);
		 return "userList";
	}

	public UserService getUserService() {
		return userService;
	}

	@Resource
	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	public String getMessage() {
		return message;
	}

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

}



Service層:
UserService Code:

Java代碼 複製代碼 收藏代碼
  1. import java.util.List;   
  2.   
  3. import com.liuzd.s2sh.entity.User;   
  4.   
  5. public interface UserService {   
  6.        
  7.     public User checkUserExits(User user) throws Exception;    
  8.     public void addUser(User user);   
  9.     public void editUser(User user);   
  10.     public void delUser(User user);   
  11.     public List<User> getUserList();   
  12.     public User getUserByUid(User user);   
  13.   
  14. }  
import java.util.List;

import com.liuzd.s2sh.entity.User;

public interface UserService {
	
	public User checkUserExits(User user) throws Exception;	
	public void addUser(User user);
	public void editUser(User user);
	public void delUser(User user);
	public List<User> getUserList();
	public User getUserByUid(User user);

}



UserServiceImpl Code:

Java代碼 複製代碼 收藏代碼
  1. import java.util.List;   
  2.   
  3. import javax.annotation.Resource;   
  4.   
  5. import org.springframework.stereotype.Component;   
  6.   
  7. import com.liuzd.s2sh.dao.UserDAO;   
  8. import com.liuzd.s2sh.entity.User;   
  9. import com.liuzd.s2sh.service.UserService;   
  10.   
  11. @Component("userService")   
  12. public class UserServiceImpl implements UserService {   
  13.   
  14.     private UserDAO userDao = null;   
  15.   
  16.     public UserDAO getUserDao() {   
  17.         return userDao;   
  18.     }   
  19.   
  20.     @Resource  
  21.     public void setUserDao(UserDAO userDao) {   
  22.         this.userDao = userDao;   
  23.     }   
  24.   
  25.     public User checkUserExits(User user) throws Exception {   
  26.         return this.userDao.getUserByUserIdAndUserNameExits(user);         
  27.     }   
  28.   
  29.     @Override  
  30.     public void delUser(User user) {   
  31.         this.userDao.delUser(user);        
  32.     }   
  33.   
  34.     @Override  
  35.     public User getUserByUid(User user) {          
  36.         return this.userDao.getUser(user);         
  37.     }   
  38.   
  39.     @Override  
  40.     public List<User> getUserList() {        
  41.         return this.userDao.finUserAll();   
  42.     }   
  43.   
  44.     @Override  
  45.     public void addUser(User user) {   
  46.         String id =String.valueOf(new java.util.Random().nextInt(100));        
  47.         //user.setId(id);   
  48.         System.out.println("添加: "+user);   
  49.         this.userDao.saveUser(user);           
  50.     }   
  51.   
  52.     @Override  
  53.     public void editUser(User user) {   
  54.         this.userDao.updateUser(user);     
  55.     }   
  56. }  
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import com.liuzd.s2sh.dao.UserDAO;
import com.liuzd.s2sh.entity.User;
import com.liuzd.s2sh.service.UserService;

@Component("userService")
public class UserServiceImpl implements UserService {

	private UserDAO userDao = null;

	public UserDAO getUserDao() {
		return userDao;
	}

	@Resource
	public void setUserDao(UserDAO userDao) {
		this.userDao = userDao;
	}

	public User checkUserExits(User user) throws Exception {
		return this.userDao.getUserByUserIdAndUserNameExits(user);		
	}

	@Override
	public void delUser(User user) {
		this.userDao.delUser(user);		
	}

	@Override
	public User getUserByUid(User user) {		
		return this.userDao.getUser(user);		
	}

	@Override
	public List<User> getUserList() {		
		return this.userDao.finUserAll();
	}

	@Override
	public void addUser(User user) {
		String id =String.valueOf(new java.util.Random().nextInt(100));		
		//user.setId(id);
		System.out.println("添加: "+user);
		this.userDao.saveUser(user);		
	}

	@Override
	public void editUser(User user) {
		this.userDao.updateUser(user);	
	}
}



Entity層:
User Code:

Java代碼 複製代碼 收藏代碼
  1. @Entity  
  2. @Table(name="users")   
  3. public class User {   
  4.        
  5.     private String id = null;   
  6.     private String username = null;   
  7.     private String password = null;    
  8.     private String address = null;   
  9.     private String sex = null;   
  10.     private Integer age = null;   
  11.        
  12.     public String getAddress() {   
  13.         return address;   
  14.     }   
  15.     public void setAddress(String address) {   
  16.         this.address = address;   
  17.     }   
  18.     public Integer getAge() {   
  19.         return age;   
  20.     }   
  21.     public void setAge(Integer age) {   
  22.         this.age = age;   
  23.     }   
  24.     public String getUsername() {   
  25.         return username;   
  26.     }   
  27.     public void setUsername(String username) {   
  28.         this.username = username;   
  29.     }   
  30.     public String getPassword() {   
  31.         return password;   
  32.     }   
  33.     public void setPassword(String password) {   
  34.         this.password = password;          
  35.     }   
  36.   
  37.     /*  
  38.      * 適合ID爲int,short,long的情況  
  39.      * @Id    
  40.     @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_USER")  
  41.     @SequenceGenerator(name="SEQ_USER",sequenceName="S_USER",allocationSize=1)  
  42.     */  
  43.        
  44.     @Id    
  45.     @GeneratedValue(generator="system-uuid")   
  46.     @GenericGenerator(name="system-uuid", strategy = "uuid")   
  47.     public String getId() {   
  48.         return id;   
  49.     }   
  50.     public void setId(String id) {   
  51.         this.id = id;   
  52.     }   
  53.     public String getSex() {   
  54.         return sex;   
  55.     }   
  56.     public void setSex(String sex) {   
  57.         this.sex = sex;   
  58.     }   
  59.        
  60.     @Override  
  61.     public String toString() {         
  62.         return "name: " + username + ",password: " + password+",sex: " + sex + ",age: " + age+",address: " + address + ",id: " + id;   
  63.     }   
  64.   
  65. }  
@Entity
@Table(name="users")
public class User {
	
	private String id = null;
	private String username = null;
	private String password = null;	
	private String address = null;
	private String sex = null;
	private Integer age = null;
	
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	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;		
	}

	/*
	 * 適合ID爲int,short,long的情況
	 * @Id	
	@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_USER")
	@SequenceGenerator(name="SEQ_USER",sequenceName="S_USER",allocationSize=1)
	*/
	
	@Id 
	@GeneratedValue(generator="system-uuid")
	@GenericGenerator(name="system-uuid", strategy = "uuid")
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	@Override
	public String toString() {		
		return "name: " + username + ",password: " + password+",sex: " + sex + ",age: " + age+",address: " + address + ",id: " + id;
	}

}



DAO層:

UserDAO Code:

Java代碼 複製代碼 收藏代碼
  1. import java.util.List;   
  2.   
  3. import com.liuzd.s2sh.entity.User;   
  4.   
  5. public interface UserDAO {   
  6.        
  7.     /**  
  8.      * 檢查用戶是否存在  
  9.      * */  
  10.     public User getUserByUserIdAndUserNameExits(User user);   
  11.     public void saveUser(User user);   
  12.     public void updateUser(User user);   
  13.     public User getUser(User user);   
  14.     public void delUser(User user);    
  15.     public List<User> finUserAll();      
  16.   
  17. }  
import java.util.List;

import com.liuzd.s2sh.entity.User;

public interface UserDAO {
	
	/**
	 * 檢查用戶是否存在
	 * */
	public User getUserByUserIdAndUserNameExits(User user);
	public void saveUser(User user);
	public void updateUser(User user);
	public User getUser(User user);
	public void delUser(User user);	
	public List<User> finUserAll();	

}


UserDAOImpl Code:

Java代碼 複製代碼 收藏代碼
  1. import java.util.List;   
  2.   
  3. import javax.annotation.Resource;   
  4.   
  5. import org.springframework.orm.hibernate3.HibernateTemplate;   
  6. import org.springframework.stereotype.Component;   
  7.   
  8. import com.liuzd.s2sh.dao.UserDAO;   
  9. import com.liuzd.s2sh.entity.User;   
  10.   
  11. @Component("userDao")   
  12. public class UserDAOImpl implements UserDAO {   
  13.        
  14.     private HibernateTemplate hibernateTemplate;    
  15.   
  16.     public HibernateTemplate getHibernateTemplate() {   
  17.         return hibernateTemplate;   
  18.     }   
  19.   
  20.     @Resource  
  21.     public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {   
  22.         this.hibernateTemplate = hibernateTemplate;   
  23.     }   
  24.   
  25.     public User getUserByUserIdAndUserNameExits(User user) {           
  26.         List<User> users = hibernateTemplate.find("from User u where u.username = '" + user.getUsername() + "' and u.password='"+user.getPassword()+"'");   
  27.            
  28.         if (users != null && users.size() > 0) {   
  29.             return users.get(0);   
  30.         }   
  31.         return null;   
  32.     }   
  33.   
  34.     @Override  
  35.     public void saveUser(User user) {   
  36.         this.hibernateTemplate.save(user);         
  37.     }   
  38.   
  39.     @Override  
  40.     public void delUser(User user) {   
  41.         User delUser = getUser(user);   
  42.         this.hibernateTemplate.delete(delUser);   
  43.     }   
  44.        
  45.   
  46.     @Override  
  47.     public List<User> finUserAll() {     
  48.         return this.hibernateTemplate.find("from User");   
  49.     }   
  50.   
  51.     @Override  
  52.     public User getUser(User user) {           
  53.         return this.hibernateTemplate.load(User.class,user.getId());   
  54.     }   
  55.   
  56.     @Override  
  57.     public void updateUser(User user) {   
  58.         this.hibernateTemplate.update(user);           
  59.     }   
  60. }  
import java.util.List;

import javax.annotation.Resource;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;

import com.liuzd.s2sh.dao.UserDAO;
import com.liuzd.s2sh.entity.User;

@Component("userDao")
public class UserDAOImpl implements UserDAO {
	
	private HibernateTemplate hibernateTemplate; 

	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	@Resource
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	public User getUserByUserIdAndUserNameExits(User user) {		
		List<User> users = hibernateTemplate.find("from User u where u.username = '" + user.getUsername() + "' and u.password='"+user.getPassword()+"'");
		
		if (users != null && users.size() > 0) {
			return users.get(0);
		}
		return null;
	}

	@Override
	public void saveUser(User user) {
		this.hibernateTemplate.save(user);		
	}

	@Override
	public void delUser(User user) {
		User delUser = getUser(user);
		this.hibernateTemplate.delete(delUser);
	}
	

	@Override
	public List<User> finUserAll() {	
		return this.hibernateTemplate.find("from User");
	}

	@Override
	public User getUser(User user) {		
		return this.hibernateTemplate.load(User.class,user.getId());
	}

	@Override
	public void updateUser(User user) {
		this.hibernateTemplate.update(user);		
	}
}



3 JSp代碼如下:
Login.jsp

Jsp代碼 複製代碼 收藏代碼
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>   
  2. <%@ taglib prefix="s" uri="/struts-tags" %>   
  3. <html>   
  4. <head>   
  5.     <title>Sign On</title>   
  6. </head>   
  7. <body>   
  8. <s:form action="userAction">   
  9.     <s:textfield key="user.username"/>   
  10.     <s:password key="user.password" />   
  11.     <s:submit/>   
  12. </s:form>   
  13. </body>   
  14. </html>  
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Sign On</title>
</head>
<body>
<s:form action="userAction">
    <s:textfield key="user.username"/>
    <s:password key="user.password" />
    <s:submit/>
</s:form>
</body>
</html>



Success.jsp,fail.jsp

Jsp代碼 複製代碼 收藏代碼
  1. <%@ page contentType="text/html; charset=UTF-8" %>   
  2. <%@ taglib prefix="s" uri="/struts-tags" %>   
  3. <html>   
  4. <head>      
  5. </head>   
  6. <body>   
  7. <s:property value="message"/><br>   
  8. <a href="${pageContext.request.contextPath}">返回</a>   
  9. <s:debug></s:debug>   
  10. </body>   
  11. </html>  
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>   
</head>
<body>
<s:property value="message"/><br>
<a href="${pageContext.request.contextPath}">返回</a>
<s:debug></s:debug>
</body>
</html>



User.jsp

Jsp代碼 複製代碼 收藏代碼
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>   
  2. <%@ taglib prefix="s" uri="/struts-tags" %>   
  3. <html>   
  4. <head>   
  5.     <title>用戶信息</title>   
  6. </head>   
  7. <body>   
  8. <s:form action="userAction!editUser.action">   
  9. <input type="hidden" name="action" value='<s:property value="action"/>'/>   
  10. <s:property value="message"/><br>   
  11. <s:if test="user.id != null">   
  12.   <s:property value="user.id"/>,<s:property value="user.username"/>,   
  13. <s:property value="user.age"/>,<s:property value="user.sex"/>,   
  14. <s:property value="user.address"/>,<s:property value="user.password"/>,   
  15. <s:property value="#request.myname"/>,<s:property value="#session.mysex"/>   
  16. </s:if>   
  17.   
  18. <br>   
  19.   <table>   
  20.       <tr>          
  21.         <td>   
  22.           <s:hidden name="user.id"/>       
  23.           <s:textfield label="姓名" name="user.username"/>             
  24.          </td>   
  25.       </tr>   
  26.       <tr>          
  27.         <td>   
  28.           <s:textfield  label="年齡" name="user.age"/>   
  29.         </td>   
  30.       </tr>   
  31.       <tr>           
  32.         <td>   
  33.           <s:select label="性別" name="user.sex"      
  34.         list="#{ 1:'男', 2: '女', 3: '未知'}"  
  35.         listKey="key"  
  36.         listValue="value"  
  37.         ></s:select>   
  38.         </td>   
  39.       </tr>   
  40.       <tr>           
  41.         <td>   
  42.           <s:textfield label="密碼" name="user.password" size="50"/>   
  43.         </td>    
  44.       </tr>   
  45.       <tr>          
  46.         <td>   
  47.           <s:textfield label="地址" name="user.address"/>   
  48.         </td>   
  49.       </tr>   
  50.       <tr>   
  51.         <td align="right">   
  52.          <s:submit vlaue="保存"/>   
  53.         </td>   
  54.       </tr>   
  55.     </table>   
  56. </s:form>   
  57. <br>   
  58. <s:debug></s:debug>   
  59. <br>   
  60. <a href="${pageContext.request.contextPath}">返回主頁</a><br>   
  61. <s:a href="userAction!userList.action">返回顯示</s:a>   
  62. </body>   
  63. </html>  
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>用戶信息</title>
</head>
<body>
<s:form action="userAction!editUser.action">
<input type="hidden" name="action" value='<s:property value="action"/>'/>
<s:property value="message"/><br>
<s:if test="user.id != null">
  <s:property value="user.id"/>,<s:property value="user.username"/>,
<s:property value="user.age"/>,<s:property value="user.sex"/>,
<s:property value="user.address"/>,<s:property value="user.password"/>,
<s:property value="#request.myname"/>,<s:property value="#session.mysex"/>
</s:if>

<br>
  <table>
      <tr>       
        <td>
          <s:hidden name="user.id"/>    
          <s:textfield label="姓名" name="user.username"/>          
         </td>
      </tr>
      <tr>       
        <td>
          <s:textfield  label="年齡" name="user.age"/>
        </td>
      </tr>
      <tr>        
        <td>
          <s:select label="性別" name="user.sex"   
	    list="#{ 1:'男', 2: '女', 3: '未知'}"
	    listKey="key"
	    listValue="value"
	    ></s:select>
        </td>
      </tr>
      <tr>        
        <td>
          <s:textfield label="密碼" name="user.password" size="50"/>
        </td> 
      </tr>
      <tr>       
        <td>
          <s:textfield label="地址" name="user.address"/>
        </td>
      </tr>
      <tr>
        <td align="right">
         <s:submit vlaue="保存"/>
        </td>
      </tr>
    </table>
</s:form>
<br>
<s:debug></s:debug>
<br>
<a href="${pageContext.request.contextPath}">返回主頁</a><br>
<s:a href="userAction!userList.action">返回顯示</s:a>
</body>
</html>



UserList.jsp

Jsp代碼 複製代碼 收藏代碼
  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>   
  2.  <%@ taglib prefix="s" uri="/struts-tags" %>   
  3. <%@ taglib uri="/WEB-INF/c.tld" prefix="c"%>   
  4. <html>   
  5. <head>   
  6.     <title>用戶集合</title>   
  7. </head>   
  8.   
  9. <body>   
  10. <table width="50%" border="1" cellpadding="1" align="center">   
  11.   <thead>   
  12.     <tr>   
  13.       <th>姓名</th>   
  14.       <th>年齡</th>   
  15.       <th>性別</th>   
  16.       <th>地址</th>     
  17.       <th>操作</th>       
  18.     </tr>   
  19.   </thead>   
  20.   <tbody>   
  21.   <!--    
  22.   <s:iterator value="#request.userList" status="status" >   
  23.     <tr align="center">          
  24.       <td><s:property value="username"/></td>   
  25.       <td><s:property value="age"/></td>   
  26.       <td><s:property value="sex"/></td>   
  27.       <td><s:property value="address"/></td>        
  28.       <td>   
  29.         <s:a href="userAction!addUser.action">添加</s:a> | <s:a href="userAction!loadUser.action?user.id=%{id}">編輯</s:a> |       
  30.         <a href="<s:url action="userAction!delUser.action"><s:param name="user.id" value="id"/></s:url>">刪除</a>          
  31.       </td>   
  32.     </tr>   
  33.  </s:iterator>     
  34.   -->   
  35.      
  36.  <c:forEach  items="${requestScope.userList}" var="user">   
  37.     <tr align="center">        
  38.       <td>${user.username}</td>   
  39.       <td>${user.age}</td>   
  40.       <td>${user.sex eq 1 ? "男" : user.sex eq 2 ? "女" : "未知"}</td>   
  41.       <td>${user.address}</td>   
  42.       <td>   
  43.         <a href="${pageContext.request.contextPath}/userAction!addUser.action">添加</a> |    
  44.         <a href="${pageContext.request.contextPath}/userAction!loadUser.action?user.id=${user.id}">編輯</a> |    
  45.         <a href="${pageContext.request.contextPath}/userAction!delUser.action?user.id=${user.id}">刪除</a>   
  46.       </td>   
  47.     </tr>   
  48.  </c:forEach>   
  49.      
  50.  </tbody>   
  51. </table>   
  52. <br>   
  53. <a href="${pageContext.request.contextPath}">返回</a>   
  54. <br>   
  55. </body>   
  56. </html>  
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 <%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c"%>
<html>
<head>
    <title>用戶集合</title>
</head>

<body>
<table width="50%" border="1" cellpadding="1" align="center">
  <thead>
    <tr>
      <th>姓名</th>
      <th>年齡</th>
      <th>性別</th>
      <th>地址</th>  
      <th>操作</th>    
    </tr>
  </thead>
  <tbody>
  <!-- 
  <s:iterator value="#request.userList" status="status" >
 	<tr align="center"> 	 	
 	  <td><s:property value="username"/></td>
 	  <td><s:property value="age"/></td>
 	  <td><s:property value="sex"/></td>
 	  <td><s:property value="address"/></td> 	   
 	  <td>
 	    <s:a href="userAction!addUser.action">添加</s:a> | <s:a href="userAction!loadUser.action?user.id=%{id}">編輯</s:a> |  	
		<a href="<s:url action="userAction!delUser.action"><s:param name="user.id" value="id"/></s:url>">刪除</a>		
 	  </td>
 	</tr>
 </s:iterator>  
  -->
  
 <c:forEach  items="${requestScope.userList}" var="user">
    <tr align="center"> 	  
 	  <td>${user.username}</td>
 	  <td>${user.age}</td>
 	  <td>${user.sex eq 1 ? "男" : user.sex eq 2 ? "女" : "未知"}</td>
 	  <td>${user.address}</td>
 	  <td>
 	    <a href="${pageContext.request.contextPath}/userAction!addUser.action">添加</a> | 
 	    <a href="${pageContext.request.contextPath}/userAction!loadUser.action?user.id=${user.id}">編輯</a> | 
 	    <a href="${pageContext.request.contextPath}/userAction!delUser.action?user.id=${user.id}">刪除</a>
 	  </td>
 	</tr>
 </c:forEach>
  
 </tbody>
</table>
<br>
<a href="${pageContext.request.contextPath}">返回</a>
<br>
</body>
</html>



4 Oracle.sql

Sql代碼 複製代碼 收藏代碼
  1. create table USERS   
  2. (   
  3.   id       VARCHAR2(50) not null,   
  4.   username VARCHAR2(50),   
  5.   age      NUMBER,   
  6.   sex      VARCHAR2(1),   
  7.   address  VARCHAR2(200),   
  8.   password VARCHAR2(20)   
  9. );   
  10. alter table USERS add constraint PKUID primary key (ID);   
  11.   
  12. insert into USERS (ID, USERNAME, AGE, SEX, ADDRESS, PASSWORD, ROWID)   
  13. values ('001''spring', 25, '1''成都市''spring''');   
  14. commit;  
  15. 代碼 http://liuzidong.iteye.com/blog/935493
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章