注意:特别感谢鲁庆贺好同志的无私奉献。
目录
1.3.2映射xml文件:Student.hbm.xml 10
2.2.2配置applicationContext.xml 20
2.3.2修改applicationContext.xml 23
2.4.1 Dao层实现类中继承HibernateDaoSupport 23
2.4.1通过生成HibernateTemplate操作数据库 23
3.3.1导入structs 2 spring library,如果前面导入了就不要再导入 33
3.3.2配置applicationContext.xml 34
4.1 jquery对<select id=”selector”>的操作 35
4.5.3 hibernate查询结果放入Map, columValue为key 40
1. Hibernate
1.1 简介
1.2配置
1.2.1 导入oracle驱动
在oracle安装目录下找到驱动,如:D:\oracle\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar,导入myeclipse中项目web-info下的lib
1.2.2导入hibernate包
1.2.2.1 右键项目—》myeclipse—》add Hibernate Capabilities…
1.2.2.2 选择hibernate3.3,注意选择复制到lib(copy checked library……)
1.2.2.3 生成xml配置文件
1.2.2.4 填写连接数据库属性
1.2.2.5 创建HibernateSessionFactory类
1.2.3 配置hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:ORCL
</property>
<property name="connection.username">username</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<!-- 显示sql语句 -->
<property name="show_sql">true</property>
<!-- 自动更新表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 自动提交 -->
<property name="connection.autocommit">true</property>
<!-- 加载映射xml文件 -->
<!--如:<mapping resource="cn/edu/zzuli/wlps/entity/Student.hbm.xml" />-->
</session-factory>
</hibernate-configuration>
1.3 创建实体及实体映射xml文件
1.3.1 Student类
package cn.edu.zzuli.wlps.entity;
public class Student {
private Integer stuId;
private String stuName;
private String stuSex;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(Integer stuId, String stuName, String stuSex) {
super();
this.stuId = stuId;
this.stuName = stuName;
this.stuSex = stuSex;
}
public Integer getStuId() {
return stuId;
}
public void setStuId(Integer stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuSex() {
return stuSex;
}
public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
}
1.3.2 映射xml文件:Student.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.edu.zzuli.wlps.entity.Student" table="STUDENT">
<id name="stuId" column="STU_ID">
<generator class="native"></generator>
</id>
<property name="stuName" column="STU_NAME"></property>
<property name="stuSex" column="STU_SEX"></property>
</class>
</hibernate-mapping>
1.4 创建Service接口及其实现类
1.4.1 StudentService接口
package cn.edu.zzuli.wlps.service;
import java.util.ArrayList;
import cn.edu.zzuli.wlps.entity.Student;
public interface StuService {
public boolean addStu(Student stu);
public boolean updateStu(Student stu);
public boolean delStu(Integer id);
public ArrayList<Student> getStuList();
public Student getStu(Integer id);
public boolean update(Student stu);
public boolean delete(Student stu);
}
1.4.2 StudentServiceImp类
package cn.edu.zzuli.wlps.service.imp;
import java.util.ArrayList;
import java.util.List;
import cn.edu.zzuli.wlps.dao.StuDao;
import cn.edu.zzuli.wlps.dao.imp.StuDaoImp;
import cn.edu.zzuli.wlps.entity.Student;
import cn.edu.zzuli.wlps.service.StuService;
public class StuServiceImp implements StuService {
private StuDao stuDao = new StuDaoImp();
public StuDao getStuDao() {
return stuDao;
}
public void setStuDao(StuDao stuDao) {
this.stuDao = stuDao;
}
@Override
public boolean addStu(Student stu) {
return stuDao.addStu(stu);
}
@Override
public boolean updateStu(Student stu) {
return stuDao.updateStu(stu);
}
@Override
public boolean delStu(Integer id) {
return stuDao.delStu(id);
}
@Override
public ArrayList<Student> getStuList() {
return stuDao.getStuList();
}
@Override
public Student getStu(Integer id) {
return stuDao.getStu(id);
}
@Override
public boolean update(Student stu) {
return stuDao.update(stu);
}
@Override
public boolean delete(Student stu) {
return stuDao.delete(stu);
}
}
1.5 创建Dao接口及其实现类
1.5.1 StudentDao接口
package cn.edu.zzuli.wlps.dao;
import java.util.ArrayList;
import cn.edu.zzuli.wlps.entity.Student;
public interface StuDao {
public boolean addStu(Student stu);
public boolean updateStu(Student stu);
public boolean delStu(Integer id);
public ArrayList<Student> getStuList();
public Student getStu(Integer id);
public boolean update(Student stu);
public boolean delete(Student stu);
}
1.5.2 StudentDaoImp类
package cn.edu.zzuli.wlps.dao.imp;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.edu.zzuli.wlps.dao.StuDao;
import cn.edu.zzuli.wlps.entity.Student;
import cn.edu.zzuli.wlps.sf.HibernateSessionFactory;
public class StuDaoImpextends HibernateDaoSupportimplements StuDao {
@Override
public int addStu(Student stu) {
int rows=0;
Session s = HibernateSessionFactory.getSession();
try {
s.beginTransaction();
s.save(stu);
s.beginTransaction().commit();
rows=1;
} catch (Exception e) {
System.out.println("添加Stu出现异常!");
}finally{
s.close();
}
return rows;
}
@Override
public int updateStu(Student stu) {
Session s = HibernateSessionFactory.getSession();
s.beginTransaction();
Query q = s.createQuery("update Student s set s.stuName=?,s.stuSex=? where stuId=?");
q.setString(0, stu.getStuName());
q.setString(1,stu.getStuSex());
q.setInteger(2, stu.getStuId());
int rows = q.executeUpdate();
s.beginTransaction().commit();
s.close();
return rows;
}
@Override
public int delStu(Student stu) {
Session s = HibernateSessionFactory.getSession();
s.beginTransaction();
Query q = s.createQuery("delete from Student s where s.stuId=?");
q.setInteger(0, stu.getStuId());
int rows = q.executeUpdate();
s.beginTransaction().commit();
s.close();
return rows;
}
@Override
public ArrayList<Student> getStuList(String hql) {
Session s = HibernateSessionFactory.getSession();
Query q = s.createQuery(hql);
s.beginTransaction();
ArrayList<Student> list = (ArrayList<Student>) q.list();
s.beginTransaction().commit();
s.close();
return list;
}
@Override
public Student getStu(Integer id) {
Session s = HibernateSessionFactory.getSession();
s.beginTransaction();
Student stu = (Student) s.get(Student.class, id);
s.beginTransaction().commit();
s.close();
return stu;
}
@Override
public void update(Student stu) {
Session s = HibernateSessionFactory.getSession();
s.beginTransaction();
s.update(stu);
s.beginTransaction().commit();
s.close();
}
}
1.6 图
1.6.1 项目结构图
1.6.2 hibernate包
2. spring
2.1 简介
2.2 配置
2.2.1 导入spring包
2.2.1.1 右键项目—》myeclipse—》add spring …
2.2.1.2 选择spring 3.0 library,共有4个包
Spring 3.0 AOP library –》AOP包
Spring 3.0 core library –》核心包
spring 3.0 persistent core library –》持久化,整合spring和hibernate
Spring 3.0 web library –》支持struts
2.2.1.3选择添加xml文件
2.2.1.4 取消勾选创建sessionFactory
2.2.2 配置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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="sf" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<bean id="stuDao" class="cn.edu.zzuli.wlps.dao.imp.StuDaoImp">
<property name="sessionFactory">
<ref bean="sf"/>
</property>
</bean>
<bean name="stuService" class="cn.edu.zzuli.wlps.service.imp.StuServiceImp">
<!-- name跟 StuServiceImp类中的属性名一致-->
<property name="stuDao">
<ref bean="stuDao"/>
</property>
</bean>
<bean name="acountService" class="cn.edu.zzuli.wlps.service.imp.AccountServiceImp">
<property name="ad">
<bean class="cn.edu.zzuli.wlps.dao.imp.AccountDaoImpl"></bean>
</property>
</bean>
</beans>
2.3 修改类中的实例化方式,改为xml文件注解
2.3.1 修改实例化方
2.3.1.1 修改new()方法举例
private StuDao stuDao = new StuDaoImp();
改为:private StuDao stuDao;
2.3.1.2 增加getter和setter方法
public StuDao getStuDao() {
return stuDao;
}
public void setStuDao(StuDao stuDao) {
this.stuDao = stuDao;
}
2.3.1.3 StudentServiceImp类
package cn.edu.zzuli.wlps.service.imp;
import java.util.ArrayList;
import java.util.List;
import cn.edu.zzuli.wlps.dao.StuDao;
import cn.edu.zzuli.wlps.dao.imp.StuDaoImp;
import cn.edu.zzuli.wlps.entity.Student;
import cn.edu.zzuli.wlps.service.StuService;
public class StuServiceImp implements StuService {
private StuDao stuDao;
public StuDao getStuDao() {
return stuDao;
}
public void setStuDao(StuDao stuDao) {
this.stuDao = stuDao;
}
@Override
public boolean addStu(Student stu) {
return stuDao.addStu(stu);
}
@Override
public boolean updateStu(Student stu) {
return stuDao.updateStu(stu);
}
@Override
public boolean delStu(Integer id) {
return stuDao.delStu(id);
}
@Override
public ArrayList<Student> getStuList() {
return stuDao.getStuList();
}
@Override
public Student getStu(Integer id) {
return stuDao.getStu(id);
}
@Override
public boolean update(Student stu) {
return stuDao.update(stu);
}
@Override
public boolean delete(Student stu) {
return stuDao.delete(stu);
}
}
2.3.2 修改applicationContext.xml
在applicationContext.xml中添加映射信息,结果如2.2.2
2.4 spring与hibernate结合
2.4.1 Dao层实现类中继承HibernateDaoSupport
public class StuDaoImp extends HibernateDaoSupport implements StuDao{}
2.4.1 通过生成HibernateTemplate操作数据库
getHibernateTemplate().—》save()/find()/execute(new HibernateCallback<Object>({}));
2.4.1 StuDaoImp代码
package cn.edu.zzuli.wlps.dao.imp;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.edu.zzuli.wlps.dao.StuDao;
import cn.edu.zzuli.wlps.entity.Student;
import cn.edu.zzuli.wlps.sf.HibernateSessionFactory;
public class StuDaoImp extends HibernateDaoSupport implements StuDao {
HibernateTemplate template;
Serializable serializable;
@Override
public boolean addStu(Student stu) {
boolean result = true;
template = getHibernateTemplate();
try {
serializable = template.save(stu);
} catch (Exception e) {
e.printStackTrace();
result = false;
}
if (serializable == null) {
result = false;
}
return result;
}
@Override
public boolean updateStu(final Student stu) {
template = getHibernateTemplate();
int rows = template.execute(new HibernateCallback<Integer>() {
@Override
public Integer doInHibernate(Session s)
throws HibernateException, SQLException {
Query qu = s.createQuery("update Student s set s.stuName=?,s.stuSex=? where id=?");
qu.setString(0, stu.getStuName());
qu.setString(1, stu.getStuSex());
qu.setInteger(2, stu.getStuId());
return qu.executeUpdate();
}
});
return rows < 1 ? false:true;
}
@Override
public boolean delStu(final Integer id) {
template = getHibernateTemplate();
int rows = template.execute(new HibernateCallback<Integer>() {
@Override
public Integer doInHibernate(Session s) throws HibernateException,
SQLException {
Query qu = s.createQuery("delete from Student where stuId=?");
qu.setInteger(0, id);
return qu.executeUpdate();
}
});
return rows < 1 ? false:true;
}
@Override
public ArrayList<Student> getStuList() {
template = getHibernateTemplate();
return (ArrayList<Student>) template.find("from Student");
}
@Override
public Student getStu(final Integer id) {
template = getHibernateTemplate();
return template.execute(new HibernateCallback<Student>() {
@Override
public Student doInHibernate(Session s)
throws HibernateException, SQLException {
s.beginTransaction();
Student stu = (Student) s.get(Student.class , id);
s.beginTransaction().commit();
s.close();
return stu;
}
});
}
@Override
public boolean update(Student stu) {
boolean result = true;
template = getHibernateTemplate();
try {
template.update(stu);
} catch (Exception e) {
e.printStackTrace();
result = false;
}
return result;
}
@Override
public boolean delete(Student stu) {
boolean result = true;
template = getHibernateTemplate();
try {
template.delete(stu);
} catch (Exception e) {
e.printStackTrace();
result = false;
}
return result;
}
}
3. struts
3.1 简介
3.2 简单配置
3.2.1 导入struts包
3.2.1.1 右键项目—》myeclipse—》add struts….
3.2.1.2 选择struts2.1
3.2.1.3 选择library,---》finish
Struts 2 Core Library –》必须的,struts核心包
Struts 2 Spring Library –》整合spring的时候再添加,纯struts不需要这个,加上会报错
3.2.2 web.xml
3.2.2.1 myeclipse自动在web.xml中添加struts入口,所有以.action结尾的请求都会被拦截
3.2.2.2 web.xml源码
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>main.jsp</welcome-file>
</welcome-file-list>
<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>*.action</url-pattern>
</filter-mapping></web-app>
3.2.3 jsp页面提交请求(以ajax方式举例)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'test.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css"href="styles.css">
-->
<script type="text/javascript" src="js/jQuery1.7.2.js"></script>
<script type="text/javascript">
function doSave(){
var stuName=$("#stuName").val();
var stuSex=$("#stuSex").val();
var stuAge=$("#stuAge").val();
var param = "stuName="+stuName+"&stuSex="+stuSex+"&stuAge="+stuAge;
$.ajax({
url:"stuAction.action",
data:param,
type:"POST",
success:function(data){
alert(data.msg);
}
});
}
</script>
</head>
<body>
姓名<input type="text" id="stuName"><br>
性别<input type="text" id="stuSex"><br>
年龄<input type="text" id="stuAge"><br>
<input type="button" value="保存" οnclick="doSave();">
</body>
</html>
3.2.4 创建action
3.2.4.1 创建action方法cn.edu.zzuli.wlps.action.StuAction并继承com.opensymphony.xwork2.ActionSupport
3.2.4.2 定义属性及其getter和setter,用于接收请求中传来的值
3.2.4.3重写execute()方法
3.2.4.3 StuAction源码
package cn.edu.zzuli.wlps.action;
import com.opensymphony.xwork2.ActionSupport;
public class StuAction extends ActionSupport{
private String stuName;
private String stuSex;
private String stuAge;
@Override
public String execute()throws Exception {
System.out.println("stuName===="+stuName);
System.out.println("stuSex===="+stuSex);
System.out.println("stuAge===="+stuAge);
return null;
}
/*-------------------getter and setter--------------------------*/
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public String getStuSex() {
return stuSex;
}
public void setStuSex(String stuSex) {
this.stuSex = stuSex;
}
public String getStuAge() {
return stuAge;
}
public void setStuAge(String stuAge) {
this.stuAge = stuAge;
}
}
3.2.5 配置struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="index" extends="struts-default">
<action name="stuAction" class="cn.edu.zzuli.wlps.action.StuAction"></action>
</package>
</struts>
3.2.6 测试验证
简单运行后,action层收到了传来的值并打印出来。
3.2.7 进阶—》存储数据到数据库—》返回值到页面
详见3.3
3.3 整合struts和spring
3.3.1 导入structs 2 spring library,如果前面导入了就不要再导入
3.3.1.1 右键项目—》build path—》add libraries—》myeclipse library—》找到structs 2 spring library勾选—》finish
3.3.2配置applicationContext.xml
3.3.2.1 在StuAction中添加StuService的实例化和getter,setter,具体的参考spring(2.3)
3.3.2.2 配置applicationContext.xml
<bean id="stuAction"class="cn.edu.zzuli.wlps.action.StuAction">
<property name="stuService">
<ref bean="stuService"/>
</property>
</bean>
3.3.2.3 配置Struts.xml,extends是struts-default,但注意传json对象时extends="json-default",json-default继承了struts-default,同时导入需要导入ezmorph-1.0.6.jar包
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="index" extends="json-default">
<!-- action name 跟请求的URL对应(去掉.action),class在spring配置中查找id -->
<action name="stuAction" class="stuAction">
<!-- result name跟return对应 -->
<result name="addResult" type="json">
<param name="root">result</param>
</result>
</action>
</package>
</struts>
4. 项目实践中的零碎知识点
4.1 jquery对<select id=”selector”>的操作
4.1.1 设置value为pxx的项选中
$("#selector").val("pxx");
4.1.2 设置text为pxx的项选中
$("#selector").find("option[text='pxx']").attr("selected",true);
这里有一个中括号的用法,中括号里的等号的前面是属性名称,不用加引号。很多时候,中括号的运用可以使得逻辑变得很简单。
4.1.3 获取当前选中项的value
$("#selector").val();
4.1.4 获取当前选中项的text
$("#selector").find("option:selected").text();
这里用到了冒号,掌握它的用法并举一反三也会让代码变得简洁。
4.1.5 级联
很多时候用到select的级联,即第二个select的值随着第一个select选中的值变化。这在jquery中是非常简单的。
如:$("#selector1").change(function(){
// 先清空第二个
$("#selector2").empty();
// 实际的应用中,这里的option一般都是用循环生成多个了
var option = $("<option>").val(1).text("pxx");
$("#selector2").append(option);
});
4.2 structs2+ajax
4.2.1 ajax
<script type="text/javascript">
$.ajax({
url:"mail_mailOptions.action",
type:"POST",
datatype:"json",
success:function (data){
for(vari =0 ;i<data.length;i++){
var param = "<option value='"+data[i].id+"'>"+data[i].mailName+"</option>";
$("#mail_addr").append(param);
}
},
/* statusCode: {
400: function() {alert('400!');},
404: function() {alert('404!');},
200: function() {alert('200!');},
503: function() {alert('503!');}
} */
});
</script>
4.2.2 Action
private JSONArray result;
public JSONArray getResult() {
return result;
}
public void setResult(JSONArray result) {
this.result = result;
}
public String mailOptions(){
List<Mail> list = mailService.selectAllMail();
result = JSONArray.fromObject(list);
System.out.println(result);
return "jsonObject";
}
4.2.3 structs.xml
<package name="mail" extends="json-default">
<action name="mail_*" class="mailAction" method="{1}">
<result name="jsonObject" type="json">
<param name="root">result</param>
</result>
</action>
</package>
4.3 页面小技巧
4.3.1正则表达式只能输入数字
onkeyup="this.value=this.value.replace(/[^\d]/g,'') "
4.3.2 捕获回车键—》提交表单
onkeydown="if(event.keyCode==13){formName.submit();}"
4.4 登录拦截器
通过filter定义拦截器,防止未登录用户访问数据。
4.4.1 web.xml配置
<!-- 定义登录拦截器 -->
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>cn.edu.zzuli.wl.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
4.4.2 定义拦截器类LoginFilter
package cn.edu.zzuli.wl.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import cn.edu.zzuli.wl.entity.User;
public class LoginFilterimplements javax.servlet.Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
HttpSession session = request.getSession();
//获取请求路径
String url = request.getRequestURI();
User user = (User) session.getAttribute("user");
//将请求路径以/分割
String[] urls = url.split("/");
//获取真实的请求
String filter = urls[urls.length - 1];
//如果是请求到达登陆界面或者登陆验证,不需要拦截
if("user_checkLogin.action".equals(filter)||"login.jsp".equals(filter)){
chain.doFilter(req, resp);
}else{
if(session.getAttribute("user")==null){
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<script type=\"text/javascript\">");
//out.println("alert('" +msg + "');");
out.println("window.open ('login.jsp','_parent');");
out.println("</script>");
out.println("</html>");
out.flush();
out.close();
}else{
chain.doFilter(req, resp);
}
}
}
public void init(FilterConfig arg0)throws ServletException {
// TODO Auto-generated method stub
}
}
4.5报表的生成
4.5.1 查询所需sql
SELECT
SUM (o.weight) AS weights,
SUM (o. VOLUME) AS volumes,
SUM (o.price) AS prices,
M .mailName AS mailName
FROM
order_table o,
mail_table M
WHERE
o.mail = M . ID
GROUP BY
mailName
4.5.2 查询结果
WEIGHTS | COLUMES | PRICES | MAILNAME |
10 | 10 | 50 | 配送点一 |
|
|
|
|
|
|
|
|
4.5.3 hibernate查询结果放入Map, columValue为key
4.5.3.1 demo1
public List getTheMapList(String sql) {
Session session = this.getSession();
SQLQuery q = (SQLQuery) session.createSQLQuery(sql).
setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List list = q.list();
session.close();
return list;
}
4.5.3.2 demo2
public List<Map<String, Object>> getOrderChartData() {
template = getHibernateTemplate();
List<Map<String, Object>> list = template.execute(new HibernateCallback<List<Map<String, Object>>>() {
@Override
public List<Map<String, Object>> doInHibernate(Session s)throws HibernateException,
SQLException {
String sql = "select sum(o.weight) as weights,sum(o.volume) as volumes ,sum(o.price) as prices ,m.mailName as mailName " +
"from order_table o,mail_table m " +
"where o.mail=m.id group by mailName";
SQLQuery q = (SQLQuery) s.createSQLQuery(sql)
.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);;
List<Map<String, Object>> resultList = q.list();
s.close();
return resultList;
}
});
return list;
}
4.6 JFreeChart
4.6.1 jar包
jfreechart-1.0.13.jar
jcommon-1.0.16.jar
4.6.2 java源码demo
package cn.edu.zzuli.wl.utils;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.struts2.ServletActionContext;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis3D;
import org.jfree.chart.axis.NumberAxis3D;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.data.category.DefaultCategoryDataset;
public class ChartUtils {
/**
* @Name: getOrderWeightChart
* @Description:使用JFreeChart统计配送点订单质量
* @Create Date: 2015年7月30日10:58:33(创建日期)
* @Parameters: List<Object[]> list 订单-配送点
* @Return: String 生成图片的名称
*/
public static String getOrderWeightChart(List<Map<String, Object>> list) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
//添加数据
for(Map<String, Object> map:list){
dataset.addValue(Integer.parseInt(map.get("WEIGHTS").toString()), "所属配送点", map.get("MAILNAME").toString());
}
JFreeChart chart = ChartFactory.createBarChart3D("配送指标", //主标题的名称
"配送点", //categoryAxisLabel X轴的标签
"配送总质量",//valueAxisLabel Y轴的标签
dataset, //图标显示的数据集合
PlotOrientation.VERTICAL, //orientation 图像的显示形式(水平或者垂直)
true,//legend 是否显示子标题
true,//tooltips 是否生成提示的标签 ,
true);//urls 是否生成URL链接
//处理图形上的乱码
//处理主标题的乱码
chart.getTitle().setFont(new Font("宋体",Font.BOLD,18));
//处理子标题乱码
chart.getLegend().setItemFont(new Font("宋体",Font.BOLD,15));
//获取图表区域对象
CategoryPlot categoryPlot = (CategoryPlot)chart.getPlot();
//获取X轴的对象
CategoryAxis3D categoryAxis3D = (CategoryAxis3D)categoryPlot.getDomainAxis();
//获取Y轴的对象
NumberAxis3D numberAxis3D = (NumberAxis3D)categoryPlot.getRangeAxis();
//处理X轴上的乱码
categoryAxis3D.setTickLabelFont(new Font("宋体",Font.BOLD,15));
//处理X轴外的乱码
categoryAxis3D.setLabelFont(new Font("宋体",Font.BOLD,15));
//处理Y轴上的乱码
numberAxis3D.setTickLabelFont(new Font("宋体",Font.BOLD,15));
//处理Y轴外的乱码
numberAxis3D.setLabelFont(new Font("宋体",Font.BOLD,15));
//处理Y轴上显示的刻度,以1作为1格
numberAxis3D.setAutoTickUnitSelection(false);
NumberTickUnit unit = new NumberTickUnit(1);
numberAxis3D.setTickUnit(unit);
//获取绘图区域对象
BarRenderer3D barRenderer3D = (BarRenderer3D)categoryPlot.getRenderer();
//设置柱形图的宽度
barRenderer3D.setMaximumBarWidth(0.07);
//在图形上显示数字
barRenderer3D.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barRenderer3D.setBaseItemLabelsVisible(true);
barRenderer3D.setBaseItemLabelFont(new Font("宋体",Font.BOLD,15));
ServletContext context = ServletActionContext.getServletContext();
String realPath = context.getRealPath("/chart");
String filename = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss");
//在D盘目录下生成图片
File file = new File(realPath + "\\" + filename);
try {
ChartUtilities.saveChartAsJPEG(file, chart, 800, 600);
} catch (IOException e) {
e.printStackTrace();
}
return filename;
}
}
4.6.3 jsp取图
<div align="center"><img src="chart/${fileName }" ></div>
4.6.4 效果演示
4.7 jquery日历插件
4.7.1 引入
<link rel="stylesheet" href="<%=basePath%>css/jcDate.css" />
<script src="<%=basePath%>js/jquery-1.7.2.js" type="text/javascript"></script>
<script src="<%=basePath%>js/jQuery-jcDate.js" type="text/javascript"></script>
4.7.2 functon
<script type="text/javascript">
$(function (){
$(".jcDate").jcDate({
IcoClass : "jcDateIco",
Event : "click",
Speed : 100,
Left : 0,
Top : 28,
format : "-",
Timeout : 100
});
});
</script>
4.7.3 输入框
<input class="jcDate" style="width:200px; height:20px; line-height:20px; padding:4px;" />
4.8 登录验证码
4.8.1 action源代码
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SafeCode extends HttpServlet {
//产生随机的字体
private Font getFont() {
Random random = new Random();
Font font[] = new Font[5];
font[0] = new Font("Ravie", Font.PLAIN, 24);
font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24);
font[2] = new Font("Forte", Font.PLAIN, 24);
font[3] = new Font("Wide Latin", Font.PLAIN, 24);
font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24);
return font[random.nextInt(5)];
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应头 Content-type类型
response.setContentType("image/jpeg");
// 以下三句是用于设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
OutputStream os = response.getOutputStream();
int width = 83, height = 30;
// 建立指定宽、高和BufferedImage对象
BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics(); // 该画笔画在image上
Color c = g.getColor(); // 保存当前画笔的颜色,用完画笔后要回复现场
g.fillRect(0, 0, width, height);
char[] ch = "abcdefghjkmnpqrstuvwxyz23456789".toCharArray(); // 随即产生的字符串 不包括 i l(小写L) o(小写O)1(数字1)0(数字0)
int length = ch.length; // 随即字符串的长度
String sRand = ""; // 保存随即产生的字符串
Random random = new Random();
for (int i = 0; i < 4; i++) {
// 设置字体
g.setFont(getFont());
// 随即生成0-9的数字
String rand = new Character(ch[random.nextInt(length)]).toString();
sRand += rand;
// 设置随机颜色
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
g.drawString(rand, 20 * i + 6, 25);
}
//产生随即干扰点
for (int i = 0; i < 20; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
g.drawOval(x1, y1, 2, 2);
}
g.setColor(c); // 将画笔的颜色再设置回去
g.dispose();
//将验证码记录到session
request.getSession().setAttribute("safeCode", sRand);
System.out.println("验证码:"+sRand);
// 输出图像到页面
ImageIO.write(image, "JPEG", os);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
4.8.2 jsp页面
<script type="text/javascript">
function changeValidateCode(obj) {
/***
* 获取当前的时间作为参数,无具体意义
* 每次请求需要一个不同的参数,否则可能会返回同样的验证码
* 这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。
*/
var timenow = new Date().getTime();
obj.src = "SafeCode?d=" + timenow;
}
</script>
<img src="SafeCode"onclick="changeValidateCode(this)" title="点击图片刷新验证码"/>