SSH文档整理

昨天,我一朋友准备搞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>


 

 

增删改查到这里就结束了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值