千家信息网

javaWeb校内网开发(二)

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,今天主要将Spring、Hibernate集成进CMS中,以及完成简单的数据库查询。首先集成Spring,首先web项目中加入jar,关于Spring的jar这里不做要求(最好都用3.0以上的),在w
千家信息网最后更新 2024年09月22日javaWeb校内网开发(二)

今天主要将Spring、Hibernate集成进CMS中,以及完成简单的数据库查询。

首先集成Spring,首先web项目中加入jar,关于Spring的jar这里不做要求(最好都用3.0以上的),在web.xml中加入Spring的监听,引导项目启动Spring,配置contextConfigLocation这个参数来装入Spring的配置文件。

                  contextConfigLocation                                    classpath:applicationContext.xml                                  struts2  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter    struts2  *.do                                            org.springframework.web.context.ContextLoaderListener                      /public/index.jsp  

现在我们来看一下applicationContext.xml应该怎么配置?

⑴首先自然不能少了数据库连接配置:这里需要注意的就是数据源类型有几种,根据个人喜好。这里我用BasicDataSource,需要引入commons-dbcp.jar,commons-pool.jar。

                                                                

这样配置数据源有2个缺点,一个是数据库密码没有加密,一个是参数值没有外在化管理。

所谓外在化管理,就是将配置文件需要传递参数单独用.properties文件保存。

Spring中有个标签可以很好的完成这项工作。目前applicationContext.xml文件配置如下:

                                                                       

jdbc.properties文件内容:(数据库配置根据自己需要配置)

jdbc.driverClassName=oracle.jdbc.driver.OracleDriverjdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcljdbc.username=cmsjdbc.password=cms

现在我们在Spring中集成Hibernate,Spring集成Hibernate有两种:

1 .完全使用hibernate编写dao层,把dao注入到spring由spring来管理生命周期,这种方式的好处是dao层与spring没有耦合关系;缺点是需要谨慎处理hibernate的session 关闭, exception, transaction.

2 .使用spring的HibernateDaoSupport.这样的话dao层使用spring提供的一系列模板方法,同时不用关心session, exception,事务管理也交给了spring.第一种方式就不说了,基本无需改变dao层。只需要把dao注入就可以了,就学习一下第二种

applicationContext.xml配置hibernate,主要分成3个部分:

1.引入数据源配置,即上面dataSource。

2.hibernate属性配置。

3.实体类加载,两种方法:要么自己列出来,要么要系统自己去读取。

                                                                             hibernate.dialect=org.hibernate.dialect.OracleDialect                                hibernate.hbm2ddl.auto=none                                hibernate.show_sql=true                                            

以上关于数据库的配置基本已经完成,关于事务控制等用到在配置。

现在我们可以开始去完成简单的登录了,关于系统中acegi配置暂时不解析,我们主要验证数据库是否配置成功。

这里强调一下,关于hibernate的jar引用,根据错误提示自己去百度,这里我就不列举需要哪些jar了。

我们回到上一章的index.jsp,我们知道CMS内容展示系统主要在系统刚进入主页就会展示一些内容,因此这里我们要修改一下进入index.jsp的方式,前面我们用welcome-file来直接进主页,现在我们这用welcome-file配置的页面调用action来查询数据然后返回index.jsp来展示数据。

先新增toindex.jsp

<%@ page language="java" pageEncoding="utf-8"%>

然后修改web.xml中welcome-file来调用struts2中的action

     toindex.jsp  

我们主要是先检验hibernate是否能使用,因此先制作新闻头条这个功能,我们在struts.xml中添加index

这个action,struts.xml如下:

                    public/index.jsp         

关于进首页就调用action,这里我遇到第一个瓶颈,首先是struts.xml中未配置以下

那么我的struts2请求一直是404,因为前面关于struts2的集成我的配置结果如下,如果配置成*.action就不用配置上面常量,do是因为个人配置。

    struts2  *.do 

现在我们编写先编写hibernate接口类,此类的作用主要是复用,大家应该清楚基本上简单的实体类都存在增、删、改、查,因此我们需要将这些方法都提取出来,根据传递参数不同来实现代码的复用。

IHibernateSupportDao.java

package com.dao;import java.util.List;import org.hibernate.criterion.DetachedCriteria;/** *   * @author zangyn  * @date 2016-11-14 下午6:14:40  * @Description: hibernate复用类,提供所有实体类能够重复使用的方法  * @throws */public interface IHibernateSupportDao {        /**         *           * @author zangyn          * @date 2016-11-14 下午6:15:27          * @Title: findByExample          * @Description: 根据sql查询结果          * @return List    返回类型          * @throws         */        public abstract List findByExample(DetachedCriteria dc);}

IHibernateSupportDaoImpl.java

package com.dao.impl;import java.util.List;import org.hibernate.SessionFactory;import org.hibernate.criterion.DetachedCriteria;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import org.springframework.transaction.annotation.Transactional;import com.dao.IHibernateSupportDao;public class IHibernateSupportDaoImpl implements IHibernateSupportDao{        @Autowired        public SessionFactory sessionFactory;        @Transactional          @Override        public List findByExample(DetachedCriteria dc) {                return dc.getExecutableCriteria(sessionFactory.getCurrentSession()).list();        }}
这里用sessionFactory.getCurrentSession()获取session,还有一种方法是openSession(),这两种方法是由区别的,具体网上都有,这里我们会遇到一个问题,我们必须在applicationContext.xml中添加Spring事务控制,然后在dao层数据库方法上添加@Transactional 这个注解

这样essionFactory.getCurrentSession()这个方法才能用,具体网上也有讲解,有疑问的可以查找。

实体类NewsEntity

package com.bean;import java.io.Serializable;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@SuppressWarnings("serial")@Entity@Table(name="news")public class NewsEntity implements Serializable{        private Integer id;        private String title;  //标题        private String author;  //作者        private String source;   //来源        private Date pubtime=new Date();  //发布时间        private String content;  //内容        private Integer viewNum=0;  //浏览数目        private String img; //新闻封面图片        private Integer status=1; //新闻状态 1普通,2推荐, 3栏目头条, 4首页flash 图片新闻                @Id        @GeneratedValue        public Integer getId() {                return id;        }        public void setId(Integer id) {                this.id = id;        }        @Column(name="title",length=50,nullable=false)        public String getTitle() {                return title;        }        public void setTitle(String title) {                this.title = title;        }        @Column(name="author",length=10,nullable=true)        public String getAuthor() {                return author;        }        public void setAuthor(String author) {                this.author = author;        }        @Column(name="source",length=20,nullable=true)        public String getSource() {                return source;        }        public void setSource(String source) {                this.source = source;        }        @Column(name="pubtime")        public Date getPubtime() {                return pubtime;        }        public void setPubtime(Date pubtime) {                this.pubtime = pubtime;        }        @Column(name="content",length=65535,nullable=false)        public String getContent() {                return content;        }        public void setContent(String content) {                this.content = content;        }        @Column(name="viewnum")        public Integer getViewNum() {                return viewNum;        }        public void setViewNum(Integer viewNum) {                this.viewNum = viewNum;        }        @Column(name="img",length=50,nullable=true)        public String getImg() {                return img;        }        public void setImg(String img) {                this.img = img;        }        @Column(name="status")        public Integer getStatus() {                return status;        }        public void setStatus(Integer status) {                this.status = status;        }}

Service层NewService.java

package com.service;import java.util.List;import org.hibernate.criterion.DetachedCriteria;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.bean.NewsEntity;import com.dao.NewDao;@Servicepublic class NewService {                @Autowired        private NewDao newDao;                public List  getNewList(DetachedCriteria newsBigImgdc){                return newDao.findByExample(newsBigImgdc);        }}

DAO层NewDao.java

package com.dao;import com.bean.NewsEntity;public interface NewDao extends IHibernateSupportDao{}

NewDaoImpl.java

package com.dao.impl;import org.springframework.stereotype.Repository;import com.bean.NewsEntity;import com.dao.NewDao;@Repositorypublic class NewDaoImpl  extends IHibernateSupportDaoImpl implements NewDao{}

LoginAction.java

package com.action;import java.util.List;import org.hibernate.criterion.DetachedCriteria;import org.hibernate.criterion.Restrictions;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;import org.springframework.stereotype.Controller;import com.bean.NewsEntity;import com.opensymphony.xwork2.ActionSupport;import com.service.NewService;@Controllerpublic class LoginAction extends ActionSupport{                @Autowired        private NewService service;                private List newsBigImgList;        public List getNewsBigImgList() {                return newsBigImgList;        }        public void setNewsBigImgList(List newsBigImgList) {                this.newsBigImgList = newsBigImgList;        }        public String toIndex(){                DetachedCriteria newsBigImgdc = DetachedCriteria.forClass(NewsEntity.class);                newsBigImgdc.add(Restrictions.eq("status", 4));                newsBigImgList=service.getNewList(newsBigImgdc);                return SUCCESS;        }}

在上面代码我们可以看到我用了@AutoWired自动注入,这里我遇到第二个纠结的问题,就是bean已经在容器里了,但是这里一直不能注入,查找了很多资料,后面才发现我们必须引入struts2-spring-plugin-2.1.8.1.jar这个jar包,这个是spring与struts2整合用的包。

现在我们在数据库创建表和加入数据

create table NEWS(  id      NUMBER,  content CLOB,  source  VARCHAR2(20),  status  NUMBER,  title   VARCHAR2(50),  author  VARCHAR2(10),  pubtime DATE,  viewnum NUMBER,  img     VARCHAR2(50),  menuid  NUMBER)insert into news (ID, CONTENT, SOURCE, STATUS, TITLE, AUTHOR, PUBTIME, VIEWNUM, IMG, MENUID)values (10, '', '校园网', 4, '大一美女新生报道', 'admin', to_date('27-04-2013 17:33:39', 'dd-mm-yyyy hh34:mi:ss'), 0, '20060502213355913.jpg', 3);insert into news (ID, CONTENT, SOURCE, STATUS, TITLE, AUTHOR, PUBTIME, VIEWNUM, IMG, MENUID)values (12, '', '哈哈', 4, '这个校园动态新闻1,你懂的。', 'admin', to_date('27-04-2013 17:35:24', 'dd-mm-yyyy hh34:mi:ss'), 0, '200812201116135572.jpg', 3);insert into news (ID, CONTENT, SOURCE, STATUS, TITLE, AUTHOR, PUBTIME, VIEWNUM, IMG, MENUID)values (13, '', '哈哈', 2, '这个校园动态新闻2,你懂的。', 'admin', to_date('27-04-2013 17:35:42', 'dd-mm-yyyy hh34:mi:ss'), 0, null, 3);insert into news (ID, CONTENT, SOURCE, STATUS, TITLE, AUTHOR, PUBTIME, VIEWNUM, IMG, MENUID)values (14, '', '哈哈', 1, '这个校园动态新闻1,你懂的。', 'admin', to_date('27-04-2013 17:36:34', 'dd-mm-yyyy hh34:mi:ss'), 0, null, 3);insert into news (ID, CONTENT, SOURCE, STATUS, TITLE, AUTHOR, PUBTIME, VIEWNUM, IMG, MENUID)values (15, '', '哈哈', 1, '这个校园风采新闻1,你懂的。', 'admin', to_date('27-04-2013 17:37:10', 'dd-mm-yyyy hh34:mi:ss'), 0, null, 4);insert into news (ID, CONTENT, SOURCE, STATUS, TITLE, AUTHOR, PUBTIME, VIEWNUM, IMG, MENUID)values (16, '', '哈哈', 2, '这个校园风采新闻2,你懂的。', 'admin', to_date('27-04-2013 17:37:19', 'dd-mm-yyyy hh34:mi:ss'), 0, null, 4);insert into news (ID, CONTENT, SOURCE, STATUS, TITLE, AUTHOR, PUBTIME, VIEWNUM, IMG, MENUID)values (17, '', '哈哈', 2, '这个校园风采新闻2,你懂的。', 'admin', to_date('27-04-2013 17:37:19', 'dd-mm-yyyy hh34:mi:ss'), 0, null, 4);insert into news (ID, CONTENT, SOURCE, STATUS, TITLE, AUTHOR, PUBTIME, VIEWNUM, IMG, MENUID)values (18, '', '哈哈', 2, '这个校园风采新闻1,你懂的。', 'admin', to_date('27-04-2013 17:37:27', 'dd-mm-yyyy hh34:mi:ss'), 0, null, 4);

这时候我们进入首页就会查询这张表并展示,注意index.jsp页面的这一块,循环遍历查询到的list,然后轮询展示,这个以后遇到了可以借鉴。

我们看一下现在的效果图:

目前已经初步完成了SSH3个框架之间的集成,剩下的就是添加其他的功能,关于权限的控制我们后面需要重点做,这节的代码我上传到51,地址:http://down.51cto.com/data/2259941

配置 数据 新闻 数据库 方法 校园 文件 查询 内容 参数 实体 就是 校园风采 系统 风采 管理 事务 代码 动态 数据源 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库前沿技术 ppt 中文wiki图片数据库 电脑服务器端 客户电话采集软件开发 苏州许梦网络技术有限公司 我心中的网络安全1500字论文 修改数据库用户密码的sql语句 华三服务器怎么进入usb安装 小程序获取数据库数据而不能显示 合肥门店管理软件开发定制 安徽服务器回收推荐云主机 网络安全性选择什么区别 星际战甲一般加速选什么服务器 新鲜蔬菜配送系统软件开发 数据库系统模型由什么组成 计算机网络技术结束语 软件开发+专注+效率 网络安全的必要性和重要性 校园网络安全手抄报警句 数据库设置查询条件 河北数据软件开发价格 深圳小学的网络安全课在哪看 ibm大连软件开发面试 html网站数据库连接 网络技术作业代做公众号 stm32 串口服务器 网页教学软件开发 我的世界跑图服务器会卡吗 网络安全具体是做什么 自动续费软件开发需要多少钱
0