Eclipse基于注解方式搭建ssh框架

第一次使用博客,不知道怎么样。之前想到上班两年多但是框架一直使用的是别人的。从来没有自己搭建一个实现增删改查。自己搭建一个测试下。

里面一些配置有的我也只知道怎么用,什么作用,不太清楚其原理(等下会把写的小例子放在csdn下可以下载看看)

目录结构:


注:使用的是mysql数据库,先新建一张用户表

DROP TABLE IF EXISTS `wxq_user`;
CREATE TABLE `wxq_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(16) NOT NULL,
  `password` varchar(16) NOT NULL,
  `gender` varchar(16) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

第一步:在Eclipse中创建一个Dynamic WebProject,本文项目名称为SSHwxq。

第二步: 把以前项目的lib下的jar包都考到这个项目中

第三步在WEB-INF下新建一个web.xml(放着后面在说内容具体怎么写)

第四步:新建实体类,因为每张表都有ID,所以我们单独新建一个实体类只放ID字段,其他实体类继承这个ID实体

package com.wxq.ssh.entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
/**
 * 含int型主键的实体标记接口
 * @author wxq
 */
@SuppressWarnings("serial")
@MappedSuperclass
public class IDEntity implements java.io.Serializable{
	@Id
    @GeneratedValue
    private Integer id;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
}

第五步:新建用户实体类

package com.wxq.ssh.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

import com.wxq.ssh.entity.IDEntity;
@SuppressWarnings("serial")
@Entity
@Table(name = "wxq_user")
public class Users extends IDEntity {
	@Column(name = "userName")
	private String userName;//用户名 
	@Column(name = "password")
	private String password;//密码
	@Column(name = "gender")
	private String gender;//性别
	//get set 方法。。。此处省略	
}

@Entity  是实体

@Table(name = "wxq_user") 对应数据库中的哪张表

@Column(name = "userName")对应这张表中的哪个字段

第六步:新建数据库访问层,接口及实现类

1、dao接口中目前只有一个方法

package com.wxq.ssh.dao;
import com.wxq.ssh.entity.Users;
/**
 * 用户接口
 * @author wxq
 */
public interface UserDao {
	 public Users regUser(Users user);  
}
2、接口的实现类

package com.wxq.ssh.dao.impl;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.wxq.ssh.dao.UserDao;
import com.wxq.ssh.entity.Users;
/**
 * 用户接口实现类
 * @author wxq
 */
@Repository
@Transactional
public class UserDaoImpl implements UserDao{
	@PersistenceContext
	private EntityManager em; 
	@Override
	public Users regUser(Users o) {
		try {
			o = em.merge(o);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return o;
	}
}

@Repository标注是数据库访问层

@Transactional标注事务管理器

@PersistenceContext

private EntityManagerem;

是注入实体类管理器,执行持久化操作的。相当于hibernate中的session可以进行mergecreateQuerycreateNativeQuery、等其他操作。

第七步:新建业务层,接口及实现类

1、新建biz接口

package com.wxq.ssh.biz;
import com.wxq.ssh.entity.Users;
/**
 * 用户业务层接口
 * @author wxq
 */
public interface UserBiz {
	 public Users regUser(Users user);  
}
2、接口的实现类

package com.wxq.ssh.biz.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.wxq.ssh.biz.UserBiz;
import com.wxq.ssh.dao.UserDao;
import com.wxq.ssh.entity.Users;
/**
 * 用户业务层接口实现类
 * @author wxq
 */
@Service
@Transactional
public class UserBizImpl implements UserBiz {
	@Autowired
	private UserDao userDaoimpl;
	@Override
	public Users regUser(Users user) {
		return userDaoimpl.regUser(user);
	}
}

@Service用于标注业务层组件

@Transactional标注事务管理器

@Autowired

private UserDaouserDaoimpl;

不需要再写setDao方法就可以通过接口调用Dao了,至于配置文件会在下面展示
第八步:新建action类
package com.wxq.ssh.action;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.opensymphony.xwork2.ActionSupport;
import com.wxq.ssh.biz.UserBiz;
import com.wxq.ssh.entity.Users;
import com.wxq.ssh.util.ResponseUtil;
@SuppressWarnings("serial")
@Component("registerAction")
public class RegisterAction extends ActionSupport {
	@Autowired
	private UserBiz userBizImpl;
	private Users user;
    public Users getUser() {
		return user;
	}
	public void setUser(Users user) {
		this.user = user;
	}
	/**
	 * 添加用户方法
	 */
	public void adduser() {  
		JSONObject object = new JSONObject();
		HttpServletResponse response = ServletActionContext.getResponse();
		try{
			user = userBizImpl.regUser(user);
			if(user.getId() != null){
				if(user.getId() > 0){
					object.put("state", "success");
				}else{
					object.put("state", "error");	
				}
			}else{
				object.put("state", "error");	
			}
		}catch(Exception ex){
			try {
				object.put("state", "error");
			} catch (JSONException e) {
				e.printStackTrace();
			}	
			ex.printStackTrace();
		}
		ResponseUtil.renderJson(response, object.toString());
    }
}

@Component("registerAction")注解,struts.xml中原本<action>class不再写类的全名,而写@Component("registerAction")registerAction
@Autowired
<pre name="code" class="java">private UserBiz userBizImpl; 
 就像之前的dao一样用注解可以不用写getset 方法一样可一调到数据 

到现在java文件都写完了,就剩下配置文件了

第一步:新建resources文件夹(跟src文件同级目录)

第二步:新建一个struts.xml

<?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>
	<!-- spring 托管 -->  
    <constant name="struts.objectFactory" value="spring" />
    <!-- 表示指定了资源文件的放置在classes目录下,基本名是ApplicationResources, -->
    <constant name="struts.custom.i18n.resources" value="ApplicationResources"/>
    <!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 -->
    <constant name="struts.i18n.encoding" value="UTF-8"/>
     <!-- 设置url请求后缀 -->
    <constant name="struts.action.extension" value="do" />
     <!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
	<constant name="struts.devMode" value="true"/>
	<!-- 将一个配置文件分解成多个配置文件,那么我们必须在struts.xml中包含其他配置文件。 -->
    <include file="struts/struts-user.xml"/>
    
   <package name="/users" extends="struts-default" namespace="/users">              
        <action name="adduser" class="registerAction" method="adduser">      
           <result name="success">/WEB-INF/pages/common.jsp</result>
        </action>
    </package>
    <package name="base-default" extends="struts-default" abstract="true">
		<interceptors>
			<interceptor-stack name="defaultStack">
				<interceptor-ref name="exception"/>
				<interceptor-ref name="alias"/>
				<interceptor-ref name="servletConfig"/>
				<interceptor-ref name="prepare"/>
				<interceptor-ref name="i18n"/>
				<interceptor-ref name="chain"/>
				<interceptor-ref name="debugging"/>
				<interceptor-ref name="profiling"/>
				<interceptor-ref name="scopedModelDriven"/>
				<interceptor-ref name="modelDriven"/>
				<interceptor-ref name="fileUpload"/>
				<interceptor-ref name="checkbox"/>
				<interceptor-ref name="staticParams"/>
				<interceptor-ref name="params">
					<param name="excludeParams">dojo\..*</param>
				</interceptor-ref>
				<interceptor-ref name="conversionError"/>
				<interceptor-ref name="validation">
					<param name="excludeMethods">input,back,cancel,browse</param>
					<param name="validateAnnotatedMethodOnly">true</param>
				</interceptor-ref>
				<interceptor-ref name="workflow">
					<param name="excludeMethods">input,back,cancel,browse</param>
				</interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="defaultStack"/>
	</package>
</struts>

Constant用来配置常量

而图片部分则是配置进入哪个action中的哪个方法

红色标注的地方class即是上面写action@Component("registerAction")注解里的名字 而method则是上面action中方法的名字

注:如果因为项目大可以把struts.xml分开写 用include导入即可例如:

把上面图片内容写在新建一个struts文件夹,在新建一个struts-user.xml即可



第三步:在resources的文件夹下面新建一个数据库连接的文件jdbc-mysql.properties:

hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.connection.autocommit=false
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.generate_statistics=false
hibernate.show_sql=false
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.password=rootwxq
jdbc.url=jdbc:mysql://localhost:3306/wxqcs?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jpa.database=MYSQL
jpa.databasePlatform=oracle.toplink.essentials.platform.database.MySQL4Platform
jpa.showSql=false

第四步:在resources文件夹下面新建一个applicationContext.xml


<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
>
    <context:property-placeholder location="classpath:jdbc-mysql.properties"/>
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          p:driverClassName="${jdbc.driverClassName}" 
          p:url="${jdbc.url}" 
          p:username="${jdbc.username}"
          p:password="${jdbc.password}"/>
          
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
          p:dataSource-ref="dataSource">
        <property name="persistenceUnitName" value="wxqdb"/>      
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
                  p:database="${jpa.database}" 
                  p:showSql="${jpa.showSql}" 
                  p:generateDdl="true"/>
        </property>
    </bean>
    <!-- 通过这个定义加上最后一句 在 Dao里面通过@Transactional注解就可以引入事物管理功能。 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"  >
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
        <property name="dataSource" ref="dataSource"/>
      
    </bean>
    <!-- 建立视图内拦截器来解决JPA中访问延迟加载属性时产生的无会话异常 -->  
    <!-- LazyInitializationException: could not initialize proxy no session -->  
    <!-- 此拦截器会注入到servlet配置中的DefaultAnnotationHandlerMapping中 -->  
    <bean name="openEntityManagerInViewInterceptor" 
        class="org.springframework.orm.jpa.support.SharedEntityManagerBean">  
        <property name="entityManagerFactory">  
            <ref bean="entityManagerFactory" />  
        </property>  
    </bean>
	  
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>
    
    <context:component-scan base-package="com.wxq" />
    <context:component-scan base-package="com.wxq.ssh.dao" />
    <context:component-scan base-package="org.texturemedia" />
    <!-- 对@Transactional这个注解进行的驱动,这是基于注解的方式使用事务配置声明 -->
    <tx:annotation-driven transaction-manager="transactionManager"  proxy-target-class="true"  mode="proxy"/>
</beans>

注:<context:property-placeholder location="classpath:jdbc-mysql.properties"/>  这句话的意思是调用上面写的数据库连接文件

        <property name="persistenceUnitName" value="wxqdb"/>       这句中的wxqdb 是后面的persistence.xml文件中的name名称

      JPA规范要求在类路径的META-INF目录下放置persistence.xml, 文件的名称是固定的,配置模板如下:  


第五步: 在resources文件夹下新建META-INF文件夹,在META-INF文件夹下新建persistence.xml文件

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">
    <persistence-unit name="wxqdb" transaction-type="RESOURCE_LOCAL">
       <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.wxq.ssh.entity.Users</class>
      	<properties>
            <property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.EhCacheRegionFactory" />
            <property name="net.sf.ehcache.configurationResourceName" value="/ehcache.xml" />
			<property name="hibernate.cache.use_second_level_cache" value="true" />
			<property name="hibernate.cache.use_structured_entries" value="true" />
			<property name="hibernate.cache.use_query_cache" value="true" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.generate_statistics" value="false" />
			<property name="hibernate.jdbc.fetch_size" value="64" />
			<property name="hibernate.jdbc.batch_size" value="32" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
			<property name="hibernate.format_sql" value="false" />
			<property name="javax.persistence.validation.group.pre-persist" value="javax.validation.groups.Default" />
            <property name="javax.persistence.validation.group.pre-update" value="javax.validation.groups.Default" />
		</properties>
    </persistence-unit>
</persistence>

这个文件中有引用/ehcache.xml 这个文件所以

第六步:在resources文件夹下新建ehcache.xml文件

<ehcache>
    <diskStore path="cache"/>
	<defaultCache
		maxElementsInMemory="100"
		eternal="false"
		overflowToDisk="false"
		timeToIdleSeconds="600"
		timeToLiveSeconds="1800"
		diskPersistent="false"
		memoryStoreEvictionPolicy="LRU"
		/>	
</ehcache>

第七步: 现在打开之前新建的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:web="http://java.sun.com/xml/ns/javaee" 
         xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>SSHwxq</display-name>
  <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>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <session-config>
    <session-timeout>120</session-timeout>
  </session-config>
  
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
			classpath:applicationContext.xml
		</param-value>
  </context-param>
  	<context-param>
		<param-name>webAppRootKey</param-name>
		<param-value>sshwxq.root</param-value>
	</context-param> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  	<error-page>
		<error-code>404</error-code>
		<location>/error.jsp</location>
	</error-page>
	<error-page>
		<error-code>500</error-code>
		<location>/error.jsp</location>
	</error-page>
</web-app>

  到这一步的时候配置文件基本已经好了,可以把项目加载在tomcat中启动一下试试

  我自己试了下启动没有报错



              现在开始编辑页面

第一步:新建一个Register.jsp页面

1、添加使用ajax添加需要先导入js库   jquery-1.8.2.min.js

    <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>   
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    <title>User Register Page</title>  
    <script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery-1.8.2.min.js"></script>
    </head>  
    <body>  
       <form id="addUserForm">
       		<p>  姓名:<input name="user.userName"  type="text" /></p>
       		<p>  密码:<input name="user.password"  type="password" /></p>
       		<p>  性别:<input name="user.gender"  type="text" /></p>
       		<input type="button" name="Submit" οnclick="adduser();" value="提 交"  />   
       		<input type="reset" name="reset" id="resetss" value="取 消" />
       </form>
      <script type="text/javascript">
	      function adduser(){
	    		$.ajax({
	    			url :  "<%=request.getContextPath()%>/users/adduser.do",
	    			type : 'POST',
	    			cache : false,
	    			data : $("#addUserForm").serialize(),
	    			dataType : "json",
	    			success : function(data) {
	    				if(data["state"] == "success"){
	    					alert("添加成功");
	    					
	    				}else{
	    					alert("服务器内部错误!");
	    				}
	    			}
	    		});
	    	}
      </script>
    </body>  
    </html>  


然后运行。


完成,数据添加成功!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值