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

来源:互联网 发布:域名在哪里续费 编辑:程序博客网 时间:2024/05/16 07:39

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

里面一些配置有的我也只知道怎么用,什么作用,不太清楚其原理(等下会把写的小例子放在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")@MappedSuperclasspublic 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@Transactionalpublic class UserDaoImpl implements UserDao{@PersistenceContextprivate EntityManager em; @Overridepublic 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@Transactionalpublic class UserBizImpl implements UserBiz {@Autowiredprivate UserDao userDaoimpl;@Overridepublic 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 {@Autowiredprivate 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.EhCacheProviderhibernate.connection.autocommit=falsehibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.generate_statistics=falsehibernate.show_sql=falsejdbc.driverClassName=com.mysql.jdbc.Driverjdbc.password=rootwxqjdbc.url=jdbc:mysql://localhost:3306/wxqcs?useUnicode=true&characterEncoding=utf8jdbc.username=rootjpa.database=MYSQLjpa.databasePlatform=oracle.toplink.essentials.platform.database.MySQL4Platformjpa.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"/><defaultCachemaxElementsInMemory="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" onclick="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>  


然后运行。


完成,数据添加成功!

0 0
原创粉丝点击