第一次使用博客,不知道怎么样。之前想到上班两年多但是框架一直使用的是别人的。从来没有自己搭建一个实现增删改查。自己搭建一个测试下。
里面一些配置有的我也只知道怎么用,什么作用,不太清楚其原理(等下会把写的小例子放在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可以进行merge、createQuery、createNativeQuery、等其他操作。
第七步:新建业务层,接口及实现类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>
然后运行。
完成,数据添加成功!