昨天,我一朋友准备搞java web,然后在学习三大框架,问我怎么学习,他叫我帮他整理一份文档出来,基本的增删改查,我花了大概2-3h时间整理了一份文档,没有用到开发工具,可能有错误,请读者指出。
一、环境配置
第一步:新建web工程(这里就不介绍了)
第二步:导入Struts2的jar包(这里用的是Struts2.3)
用到spring还要加入:
然后打开web.xml 文件
配置如下:
<!-- 配置struts2的主过滤器 -->
<filter>
<!--这里的filter-name 和下面的name 一定要一样,大小写要区分-->
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!--这里的/*代表拦截所有资源,你如果改成*.action表示只拦截.action的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
配置完这一步后,在src目录下配置struts.xml文件(这里你可以去Struts的压缩包中,解压缩,然后找到apps/struts2-blank.war解压缩出来,先把war改成zip,然后解压,在web-inf目录下classes目录下拷贝struts.xml到src目录下)
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 把action扩展名配置为action 配置之后,访问时必须带.action-->
<constant name="struts.action.extension" value="action" />
<!-- 指定主题使用simple(默认值为xhtml) -->
<constant name="struts.ui.theme" value="simple" />
<!-- 定义全局的国际化资源文件-->
<constant name="struts.custom.i18n.resources"value="MessageResources"></constant>
<!-- 可以把相关的action都放在一个package中,以便于管理,形成模块-->
<package name="default" extends="struts-default">
</package>
</struts>
再配置 hibernate(这里用的是hibernate3.6)
首先导入jar包
以上是hibernate的包,还要导入相应的数据库的包,这里用的数据库是mysql,导入mysql.jar
然后配置hibernate.cfg.xml文件
在hibernate/project包下搜索hibernate.cfg.xml文件,然后copy过来, 放置在src目录下,把里面的内容修改成如下内容:(这里用的数据库是mysql,配置oracle可以参考下面两个链接的文章http://www.blogjava.net/Alpha/archive/2008/04/15/193094.html http://blog.csdn.net/xrt95050/article/details/5587728)
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2,说明:在这里不配置数据库连接信息,是在后面Spring中整合Hibernate时配置的(配置c3p0数据库连接池)。 -->
<!—配置自动生成表结构 不懂为什么配置update可以去google,这是hibernate基础 -->
<property name="hbm2ddl.auto">update</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
再配置spring(这里用的是spring2.5)
首先导入jar包
首先创建applicationContext.xml文件,配置文件在spring的包中搜索applicationContext.xml文件,copy过来,放置在src目录下,配置如下:
<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 配置bean的自动扫描与装配
一般项目的命令为:
com.xxz.项目名.domain(或者是bean 都表示是实体类)
com.xxz.项目名.dao
com.xxz.项目名.dao.impl
com.xxz.项目名.service
com.xxz.项目名.service.impl
com.xxz.项目名.action
com.xxz.项目名.util
加入你的项目名叫project,那么下面base-package的值为:com.xxz.project(推荐),这样就可以扫描到所有配置了注解的类。也可以写成com.xxz还可以写成 com 这些都不推荐
-->
<context:component-scan base-package="com.xxz.project "></context:component-scan>
<!-- 配置hibernate数据库配置 -->
<!-- 配置数据库连接池c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--数据库信息 -->
<property name="jdbcUrl" value="数据库访问地址"></property>
<property name="driverClass" value="数据库驱动"></property>
<property name="user" value="用户名"></property>
<property name="password" value="密码"></property>
<!--其他配置,这些配置根据自己的需求改动,一般不需要变 -->
<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="3"></property>
<!--连接池中保留的最小连接数。Default:3 -->
<property name="minPoolSize" value="3"></property>
<!--连接池中保留的最大连接数。Default:15 -->
<property name="maxPoolSize" value="5"></property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default:3 -->
<property name="acquireIncrement" value="3"></property>
<!--控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0 -->
<property name="maxStatements" value="8"></property>
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<property name="maxStatementsPerConnection" value="5"></property>
<!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="1800"></property>
</bean>
<!--配置SessionFactory 由spring管理hibernate的sessionFactory
如果hibernate采用的注解方式配置,那么这里的class属性的值要变,这里就不做详细的配置,自己google
-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!--配置声明式的事务管理(采用基于注解的方式) -->
<bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
在web.xml文件中配置spring的监听
<!-- 配置Spring的监听器,用于初始化ApplicationContext对象 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
再配置log4j 配置文件放置在src目录下(log4j.properties),配置如下(根据自己需求修改,一般不需要变):
### direct log messages to stdout ###
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
### direct messages to file hibernate.log###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE}%5p %c{1}:%L - %m%n
### set log levels - for more verboselogging change 'info' to 'debug' ###
log4j.rootLogger=error, stdout
#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug
### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug
### log just the SQL
#log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug
### log schema export/update ###
#log4j.logger.org.hibernate.tool.hbm2ddl=debug
### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug
### log cache activity ###
#log4j.logger.org.hibernate.cache=debug
### log transaction activity
#log4j.logger.org.hibernate.transaction=debug
### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug
### enable the following line if you wantto track down connection ###
### leakages when usingDriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
一般项目都需要测试,然后这里要加入测试的jar包
还加入jstl的jar 这是为了多人开发的时候,防止出现环境不统一的情况,最好加上
在开发中还会用到一些常用的工具类,如md5加密,String字符串的操作,还加入如下包:
这些包在spring中可以找到。
配置就完成了。
二、数据库设计 (oracle数据库)
首先在数据库中创建一个数据库。这里我创建的数据叫ssh_test
再创建一张表 表名:user
表中的字段有:id,username,password,nickname
在数据中,一般都有一个id 这个id作为主键,mysql中支持自增长,使用native或者其他的,这里不详细讲解,可以google,在oracle中不支持自增长,可以使用序列,或者uuid
这里在com.xxz.project.domain中创建User.java文件
代码如下:
puclic class User {
private Integer id;
private String username;
private String password;
private String nickname;
public User(){}
// gettersetter 略
}
首先看一段关于oracle自增的讲解(如果用sequence看下面链接):
http://vianoz.iteye.com/blog/650808
看了上面的分析后,我们开始写配置。(主键增长策略使用的native)
然后创建相应的hbm.xml映射文件,名称:User.hbm.xml
配置如下(在hibernate的包下,搜索hbm.xml文件,copy过来,重命名User.hbm.xml):
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.xxz.project.domain">
<class name="User" table="t_user ">
<id name="id">
<generator class="native" />
</id>
<!—不指定其他属性,hibernate会自动根据实体类生成 -->
<property name="username" />
<property name="password" />
<property name="nickname" />
</hibernate-mapping>
配置完成后,在hibernate.cfg.xml文件中配置该信息
在<session-factory>节点中配置
<mapping resource="com/xxz/project/domain/User.hbm.xml"/>
下面开始写Dao层
创建包
com.xxz.project.base
com.xxz.project.dao
com.xxz.project.dao.impl
com.xxz.project.service
com.xxz.project.service.impl
com.xxz.project.action
com.xxz.project.util
在com.xxz.project.base中创建BaseDao.java
代码如下:
// @Transactional 可以被继承,即子类也有效
@Transactional
public abstract class BaseDao {
@Resource
privateSessionFactory sessionFactory;
/**
* 获取当前可用的sessionprotected 保证子类可以获取
*
* @return
*/
protectedSession getSession() {
returnsessionFactory.getCurrentSession();
}
}
先写dao接口
在com.xxz.project.dao 中新建UserDao.java文件
代码如下:
public interface UserDao {
void save(User user);
void delete(Integer id);
void update(User user);
List<User> findAll();
User findById(Integer id);
}
在com.xxz.project.dao.impl中新建UserDaoImpl.java
代码如下:
@Repository
public class UserDaoImpl extends BaseDao implements UserDao {
public void save(User user){
getSession().save(user);
}
public void delete(Integer id){
Object obj = getSession().get(User.class,id);
getSession().delete(obj);
}
public void update(User user){
getSession().update(user);
}
public User findById(Integerid) {
if (id == null)
return null;
return getSession().get(User.class,id);
}
public List<User> findAll() {
return getSession().createQuery(//
"FROM User")//
.list();
}
}
再编写service层
在com.xxz.project.service 中新建UserService.java文件
代码如下:
public interface UserService{
void save(User user);
void delete(Integer id);
void update(User user);
List<User> findAll();
User findById(Integer id);
}
在com.xxz.project.service.impl 中新建UserServiceImpl.java文件
代码如下:
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
@Override
public List<User> findAll() {
returnuserDao.findAll();
}
@Override
public void delete(Integer id) {
userDao.delete(id);
}
@Override
public void save(User user) {
userDao.save(user);
}
@Override
public User findById(Integer id) {
returnuserDao.findById(id);
}
@Override
public void update(User user) {
userDao.update(user);
}
}
再编写action层代码:
@Controller
public class UserAction extendsActionSupport implements ModelDriven<User> {
@Resource
private UserService userService;
private User model = new User();
@Override
public User getModel() {
return model;
}
/**列表 */
public String list() throws Exception {
List<User> userList = userService.findAll();
ActionContext.getContext().put("userList",userList);
return"list";
}
/**删除 */
public String delete() throws Exception {
userService.delete(model.getId());
return"toList";
}
/**添加页面 */
public String addUI() throws Exception {
return"addUI";
}
/**添加 */
public String add() throws Exception {
//得到参数,封装成对象,当使用实体作为Model时,也可以直接使用model
userService.save(model);
return"toList";
}
/**修改页面 */
public String editUI() throws Exception {
//1,准备回显信息
Useruser = userService.findById(model.getId());
//2,把对象放到栈顶
ActionContext.getContext().getValueStack().push(user);
return"editUI";
}
/**修改 */
public String edit() throws Exception {
Useruser = userService.findById(model.getId());
user.setUsername(model.getUsername());
user.setPassword(model.getPassword());
user.setNickname(model.getNickname());
//保存到数据库
userService.update(user);
return"toList";
}
}
在struts.xml的package节点中配置如下:
<!-- 用户管理 -->
<action name="userAction_*" class="com.xxz.project.domain.User" method="{1}">
<result name="list">/WEB-INF/jsp/userAction/list.jsp</result>
<result name="addUI">/WEB-INF/jsp/userAction/addUI.jsp</result>
<result name="editUI">/WEB-INF/jsp/userAction/editUI.jsp</result>
<result name="toList" type="redirectAction">userAction_list</result>
</action>
再/WEB-INF/目录下创建一个jsp目录
在为每一个action创建一个action目录,如userAction就创建一个userAction的目录
在userAction目录中创建三个jsp文件,list.jsp addUI.jsp editUI.jsp
list.jsp内容如下:
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags"%>
<html>
<head></head>
<body>
<table border=”1”>
<s:iterator value="#userList">
<tr>
<td>${username} </td>
<td>${password} </td>
<td>${nickname} </td>
<td>
<s:a action="userAction_delete.action?id=%{id}">删除</s:a>
<s:a action="userAction_editUI.action?id=%{id}">修改</s:a>
</td>
</tr>
<tr>
<td colspan=”4”>
<s:a action=”userAction_addUI.action”>添加</s:a>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>
addUI.jsp内容如下:
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags"%>
<html>
<head></head>
<body>
<s:form action="userAction_add.action">
<table border=”1”>
<tr>
<td>username<td>
<td>
<input type=”text”name=”username”/>
<td>
</tr>
<tr>
<td>password<td>
<td>
<input type=”text”name=”password”/>
<td>
</tr>
<tr>
<td>nickname<td>
<td>
<input type=”text”name=” nickname”/>
<td>
</tr>
<tr>
<tdclospan=”2”>
<inputtype=”submit” value=”submit” />
<td>
</tr>
</table>
</s:form>
</body>
</html>
editUI.jsp 内容如下:
<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags"%>
<html>
<head></head>
<body>
<s:form action="userAction_edit.action">
<table border=”1”>
<tr>
<td>username<td>
<td>
<input type=”text”name=”username” value=”${username}”/>
<td>
</tr>
<tr>
<td>password<td>
<td>
<input type=”text”name=”password” value=”${password}”/>
<td>
</tr>
<tr>
<td>nickname<td>
<td>
<input type=”text”name=” nickname” value=”${nickname}”/>
<td>
</tr>
<tr>
<tdclospan=”2”>
<inputtype=”submit” value=”submit” />
<td>
</tr>
</table>
</s:form>
</body>
</html>
增删改查到这里就结束了。