SSH说的上是javaweb经典框架,不能说100%要会SSH框架,但是大部分公司都在用,说到框架,都会提到ssh吧,这次就以很简单的注册例子来整合SSH框架。整合框架要注意的是先每个框架单独测通后再整合,不然整合后出现问题比较难排查。
在做一切之前先将可能使用到的SSHjar包进行导入,不一定为最简,但一定够用:
对于SSH整合,共使用到applicationContext.xml,web.xml,struts.xml,Person.bhm.xml四个配置文件,创建位置在下面详述。
applicationContext.xml:
位置 放在src下
1.BasicDataSource中连接数据库的各种参数property,其中有很多参数以供选择
2.SessionFacotry创建session对象的Bean
其中需要引用到DataSource,用设值注入,使用LoaclSessionFactory方法的父类AbstractSessionFactoryBean中的dataSource方法,将属性写入Bean,ref:引用数据库的dataSource。此时获得到sessionFactory。
还需要导入Hibernate配置文件中的show_sql的内容:Hibernate.Properties文件中的show_sql字段。和线程绑定模式的应用。
用法:
true
com/ssh/entity/Person.hbm.xml
3.创建实体类Person,添加属性构造和getter、setter方法
hbm映射文件:
位置hibernate jar包中
放在实体类的class下。
4.配置hbm文件,配置完成后将目录导入applicationContext.xml文件中value属性中。
seq_newsId
5.创建Dao层接口,PersonDao为Person实体的dao。每一个实体使用时都需要dao,因为有特有的方法。不建议建立泛型Dao。
package com.ssh.Dao;
import java.util.List;
import com.ssh.entity.Person;
public interface PersonDao {
public boolean login(Person person);
public boolean add(Person person);
public boolean update(Person person);
public boolean delete(int pid);
public Person queryById(int pid);
public List queryAll();
}
添加实现类Impl,在实现类中传入一个session对象,此时的sessionFactory需要从配置文件中注入才可以使用,注意此处不能注入接口,都需要注入实现类。
public class PersonDaoImpl implements PersonDao{
private SessionFactory sessionFactory;
boolean flag=false;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public boolean login(Person person) {
String hql = "from Person where pname=? and pwd=?";
Session session = sessionFactory.openSession();
Query q = session.createQuery(hql);
q.setString(0, person.getPname());
q.setString(1, person.getPwd());
Object obj = q.uniqueResult();
if (obj != null) {
flag = true;
}
session.close();
return flag;
}
}
6.添加服务层。PersonService接口和PersonSercviceImpl实现类。
package com.ssh.Dao.Impl;
import java.util.List;
import com.ssh.Dao.PersonDao;
import com.ssh.Dao.PersonService;
import com.ssh.entity.Person;
public class PersonServiceImpl implements PersonService{
private PersonDao ServiceDao;
public void setServiceDao(PersonDao serviceDao) {
ServiceDao = serviceDao;
}
@Override
public boolean login(Person person) {
return ServiceDao.login(person);
}
@Override
public boolean add(Person person) {
// TODO Auto-generated method stub
return ServiceDao.add(person);
}
@Override
public boolean update(Person person) {
// TODO Auto-generated method stub
return ServiceDao.update(person);
}
@Override
public boolean delete(int pid) {
// TODO Auto-generated method stub
return ServiceDao.delete(pid);
}
@Override
public Person queryById(int pid) {
// TODO Auto-generated method stub
return ServiceDao.queryById(pid);
}
@Override
public List queryAll() {
// TODO Auto-generated method stub
return ServiceDao.queryAll();
}
}
测试类Test:
Person person =new Person(0,"tom","123");
ApplicationContext ac=new ClasspathxmlContext("applicationContext.xml");
PersonService personService=(PersonService)ac.getBean("personSecivce");
boolean falg=personservice.login(person);
此时出现空指针,需要将两个实现类中的Bean注入到配置文件中,实现类引用sessionFactory。
添加Hibernate时遇到的问题:
1.注入Impl实现类时,使用到的setter注入,其中id必须和创建的sessionFactory以及setPersonDao的参数名称相同,id sessionFactory与
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
名称相同,id personDao和
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
名称相同。
2.实体类中Person构造方法没写。
修改后编译成功,命令行成功显示flag登录的boolean值。
1.导入jar包
2.strut2和web配置文件:
web.xml:
加入file标签
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
struts.xml:
修改常量
编写action标签获取result两种结果。
/WEB-INF/jsp/error.jsp
show.jsp
login.jsp
3.编写jsp登录测试页面
login.jsp和show.jsp:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
Insert title here
show.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
Insert title here
编号
姓名
密码
4.创建Action类继承ActionSupport实现ModelDriven
使用MODEL第三种方式模型驱动创建实体类对象,编写login方法。
package com.ssh.Action;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.ssh.Dao.PersonService;
import com.ssh.entity.Person;
public class PersonAction extends ActionSupport implements ModelDriven {
private Person person;
private PersonService personService;
private List list;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public void setPersonService(PersonService personService) {
this.personService = personService;
}
@Override
public Person getModel() {
// TODO Auto-generated method stub
return person;
}
public String login() throws Exception {
boolean flag = true;
String path = INPUT;
flag = personService.login(person);
if (flag) {
path = SUCCESS;
}
queryAll();
return path;
}
public String queryAll() throws Exception {
boolean flag = false;
String path = INPUT;
list = personService.queryAll();
if (list != null) {
path = SUCCESS;
}
return path;
}
}
5.将PersonAction注入Spring配置文件中,,此处只能使用name属性,将从sessionFactory获取到的PersonDaoImpl的内容注入PersonAction。
web.xml:
在其中设置spring配置文件,将其在程序启动的同时就加载,使用Listener监听器。
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
WEB-INF/classes/applicationContext.xml
程序到这里实现了登录以及查询所有数据。
注意:在person模型驱动的时候,必须进行实例化Person。不可只定义对象。
模型驱动的用法没搞清楚。