jsp中ueditor报错java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.getTempDirectory()Ljava/io/File
jsp版的ueditor报如下错误:
严重: Servlet.service() for servlet jsp threw exception java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.getTempDirectory()Ljava/io/File; at com.baidu.ueditor.upload.StorageManager.getTmpFile(StorageManager.java:117) at com.baidu.ueditor.upload.StorageManager.saveFileByInputStream(StorageManager.java:51) at com.baidu.ueditor.upload.BinaryUploader.save(BinaryUploader.java:75) at com.baidu.ueditor.upload.Uploader.doExec(Uploader.java:24) at com.baidu.ueditor.ActionEnter.exec(ActionEnter.java:62) at org.apache.jsp._2009admin05.ueditor1_005f4_005f2_002dgbk_002djsp.jsp.controller_jsp._jspService(controller_jsp.java:61) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.util.ChangeCharsetFilter.doFilter(ChangeCharsetFilter.java:44) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:164) at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141) at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90) at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.filter.UeditorStrutsFilter.doFilter(UeditorStrutsFilter.java:19) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619)
出现这个问题的原因是ueditor中带的commons-io-2.4.jar与已存在的jar文件有冲突,解决办法是删除 WEB-INF/lib/ 中旧的commons-io-xx.jar(xx是版本号)
Struts2+Hibernate实现分页
实际开发中,Struts2+Hibernate实现分页是JAVA WEB最常用的东西了,本文将分步为您分享如何进行分页操作,有不足之处请指出,希望与大家一起进步。
第一步:建立一个SQL数据库Tb_soft ,数据库表,software(字段:Tsoftware,fSoftname,fListImage,fVar,fFeilname,fUsedSystem,fUpdateTime,fInf,fClassID,fDownTimes 字段
类型并不重要自己随便设置然后直接通过SQL企业管理器直接在表里输入内容方便测试就是了)
第二步:建立一个名为productlist JAVA的WEB项目(我用的是NetBeans IDE 6.9,所以在新建项目的时候选择了Struts2 HIBERNATE框架,新建后会自动生成 hibernate.cfg.xml的配置文件
)。
第三步:配置hibernate.cfg.xml文件,主要是对数据库的链接设置以及数据表映射文件的设置
1、文件名:hibernate.cfg.xml文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<property name="hibernate.connection.url">jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Tb_soft </property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">123456</property>
<mapping resource="soft.hbm.xml"/>
</session-factory>
</hibernate-configuration>
注: <mapping resource="soft.hbm.xml"/> 元素对数据库表software 配置文件soft.hbm.xml的映射配置,注意soft.hbm.xml文件的路径如果和hibernate.cfg.xml文件没在同一个目录必须
加上路径例如 <mapping resource="DatatableXML/soft.hbm.xml"/>
2、新建 名为:soft.hbm.xml 的映射文件,该文件主要是对数据库表software的映射配置全部代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name= "com.bean.soft" table="Tsoftware">
<id name="id" column="id" type="int">
<generator class="native"/>
</id>
<property name="fSoftname" type="string" length="20">
<column name="fSoftname"/>
</property>
<property name="fListImage" type="string" length="20">
<column name="fListImage"/>
</property>
<property name="fVar" type="string" length="10">
<column name="fVar"/>
</property>
<property name="fFeilname" type="string" length="30">
<column name="fFeilname"/>
</property>
<property name="fUsedSystem" type="string" length="30">
<column name="fUsedSystem"/>
</property>
<property name="fUpdateTime" type="string" length="30">
<column name="fUpdateTime"/>
</property>
<property name="fInf" type="string" length="2000">
<column name="fInf"/>
</property>
<property name="fDownTimes" type="string" length="10">
<column name="fDownTimes"/>
</property>
</class>
</hibernate-mapping>
注: <class name= "com.bean.soft" table="Tsoftware">设置了soft属于一个javabean,关于javabean我就不解释了。关于这个文件的代码后面再贴出来。class name=javabean包
+javabean构成, table="Tsoftware",其中Tsoftware就是SQL数据库表。有关property 元素我这里简单的说一下 例如下:
<property name="fDownTimes" type="string" length="10">
<column name="fDownTimes"/>
</property>
name,映射文件构成表的的字段名,这里的name必须与com.bean.soft 中的熟悉对应,千万记住要设置好type ,这里的type好比SQL的字段类型,具体类型对应关系请查相关资料我就不详细解
释了。
第四步:在包com.bean 建立JAVAbean soft 代码如下:
package com.bean;
/**
*
* @author Even
*/
public class soft {
private String fSoftname;
private int id;
private String fListImage;
private String fVar;
private String fFeilname;
private String fUsedSystem;
private String fUpdateTime;
private String fInf;
private String fDownTimes;
/**
* @return the fSoftname
*/
public String getfSoftname() {
return fSoftname;
}
/**
* @param fSoftname the fSoftname to set
*/
public void setfSoftname(String fSoftname) {
this.fSoftname = fSoftname;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the fListImage
*/
public String getfListImage() {
return fListImage;
}
/**
* @param fListImage the fListImage to set
*/
public void setfListImage(String fListImage) {
this.fListImage = fListImage;
}
/**
* @return the fVar
*/
public String getfVar() {
return fVar;
}
/**
* @param fVar the fVar to set
*/
public void setfVar(String fVar) {
this.fVar = fVar;
}
/**
* @return the fFeilname
*/
public String getfFeilname() {
return fFeilname;
}
/**
* @param fFeilname the fFeilname to set
*/
public void setfFeilname(String fFeilname) {
this.fFeilname = fFeilname;
}
/**
* @return the fUsedSystem
*/
public String getfUsedSystem() {
return fUsedSystem;
}
/**
* @param fUsedSystem the fUsedSystem to set
*/
public void setfUsedSystem(String fUsedSystem) {
this.fUsedSystem = fUsedSystem;
}
/**
* @return the fUpdateTime
*/
public String getfUpdateTime() {
return fUpdateTime;
}
/**
* @param fUpdateTime the fUpdateTime to set
*/
public void setfUpdateTime(String fUpdateTime) {
this.fUpdateTime = fUpdateTime;
}
/**
* @return the fInf
*/
public String getfInf() {
return fInf;
}
/**
* @param fInf the fInf to set
*/
public void setfInf(String fInf) {
this.fInf = fInf;
}
/**
* @return the fDownTimes
*/
public String getfDownTimes() {
return fDownTimes;
}
/**
* @param fDownTimes the fDownTimes to set
*/
public void setfDownTimes(String fDownTimes) {
this.fDownTimes = fDownTimes;
}
}
关于JAVAbean就不解释了。
第五步:在com.Hibernate包建立Hibernate的sessionFactory(文件名:NewHibernateUtil.java)用于获取Session
NewHibernateUtil.java 代码:
package com.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* Hibernate Utility class with a convenient method to get Session Factory object.
*
* @author Even
*/
public class NewHibernateUtil {
private static SessionFactory sessionFactory = null;
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
static {
try {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("对不起数据工厂构建失败." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getsession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildsessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession() : null;
threadLocal.set(session);
}
return session;
}
private static void rebuildsessionFactory() {
try {
Configuration cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e) {
System.out.print("创建工厂会话失败!");
e.printStackTrace();
}
}
public static SessionFactory getsessionFactory() {
return sessionFactory;
}
public static void closesessicon() {
Session session = (Session) threadLocal.get();
if (session != null) {
session.close();
}
}
}
这里注意session的关闭。
第六步:在包com.dao包建立整个程序的dao层;文件名为:softDao.java
代码如下:
package com.dao;
/**
*
* @author Even
*/
import com.Hibernate.NewHibernateUtil;
import com.bean.soft;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
public class softDao {
public List<soft> queryByPage(int pageSize, int pageNow, String HQL) {
Session session = null;
List sftlist = new ArrayList();
try {
session = NewHibernateUtil.getsession();// 获得session对象
//String hql = "from Employee emp";// 查询HQL语句
HQL = "from soft sft";// 条件查询HQL语句
Query q = session.createQuery(HQL);// 执行查询操作
q.setFirstResult(pageSize * (pageNow - 1));
q.setMaxResults(pageSize);
sftlist = q.list();
} catch (HibernateException e) {
e.printStackTrace();
System.out.println("查询失败");
} finally {
NewHibernateUtil.closesessicon();// 关闭session
}
return sftlist;
}
//获得总页数的方法有时间可能会单独使用该工程所以将获得session的过程也单独写出来
public int getpageCount(int pagesize, String HQL) {
int pageCount;
int Datacount = 0;
Session session = null;
try {
session = NewHibernateUtil.getsession();// 获得session对象
HQL = "from soft sft";//条件查询HQL语句,这里注意使用的实例查询方式,soft是我们建立的javabean
Query q = session.createQuery(HQL);// 执行查询操作
Datacount = q.list().size();//获得记录总数
} catch (HibernateException e) {
e.printStackTrace();
System.out.println("查询失败");
} finally {
NewHibernateUtil.closesessicon();// 关闭session
}
if (Datacount % pagesize == 0) {
pageCount = Datacount / pagesize;
} else {
pageCount = Datacount / pagesize + 1;
}
return pageCount;
}
}
这里就不多解释了。
第七步:在包com.action 建立分页的Action文件名为:softlistAction.java
代码如下:
package com.action;
import com.bean.leavetalk;
import com.bean.soft;
import com.dao.Dao;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
public class softlistAction extends ActionSupport {
private List<soft> softs;//用于数据集合对象并非只是软件
private List<soft> downcountlist;//显示下载列表的集合
private List<leavetalk> leavatalks;//显示用户留言列表的集合
private int pageNow = 1; //默认从第一页开始显示
private int pageSize = 4; //每页显示5条
private int pageCount;//总页数
private String doing;//标记Action返回的值
private Dao pageDAO = new Dao();
private Dao leivetalkdao = new Dao();
private int id;
private String fbadcount;
private String fgoodcount;
public List<soft> getSofts() {
return softs;
}
public void setSofts(List<soft> softwares) {
this.softs = softs;
}
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
this.pageNow = pageNow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageCount() {
Dao sa = new Dao();
sa.getpageCount(pageSize, "");
this.pageCount = sa.getpageCount(pageSize, "");
return sa.getpageCount(pageSize, "");
}
/**
* @param pageCount the pageCount to set
*/
public void setPageCount() {
Dao sa = new Dao();
sa.getpageCount(pageSize, "");
this.pageCount = sa.getpageCount(pageSize, "");
}
/**
* @return the doing
*/
public String getDoing() {
return doing;
}
/**
* @param doing the doing to set
*/
public void setDoing(String doing) {
this.doing = doing;
}
//主方法
public String execute() throws Exception {
String returnstr = "erro";
String HQLstr = "";
// softs = pageDAO.queryByPage(pageSize, pageNow, HQLstr);
if (doing.equals("productlist")) {
returnstr = "productlist";
HQLstr = "from soft sft";
this.setPageSize(4);
this.leavatalks = leivetalkdao.getleavetalks("from leavetalk lt order by lt.id desc");
this.softs = pageDAO.queryByPage(pageSize, pageNow, HQLstr);
} else if (doing.equals("productshow")) {
returnstr = "productshow";
HQLstr = "from soft sft where sft.id=¹" + getId() + "¹ order by sft.id asc";
downcountlist = pageDAO.queryByPage(10, pageNow, "from soft sft order by sft.fDownTimes desc");
} else if (doing.equals("index")) {
returnstr = "index";
HQLstr = " from soft sft where sft.ftype=¹T¹order by sft.id asc";
this.setPageSize(5);
} else if (doing.equals("web")) {
returnstr = "web";
HQLstr = " from soft sft where sft.ftype=¹T¹order by sft.id asc";
this.setPageSize(5);
} else if (doing.equals("service")) {
returnstr = "service";
//HQLstr = " from service sr where order by sr.id asc";
// this.setPageSize(1);
} else if (doing.equals("Updatefgood")) {
returnstr = "Updatefgood";
HQLstr = "from soft sft where sft.id=¹" + getId() + "¹ order by sft.id asc";
downcountlist = pageDAO.queryByPage(10, pageNow, "from soft sft order by sft.fDownTimes desc");
pageDAO.UpdatefgoodAndfbad(getId(), "updategood", fgoodcount);
} else if (doing.equals("Updatefbad")) {
returnstr = "Updatefgood";
HQLstr = "from soft sft where sft.id=¹" + getId() + "¹ order by sft.id asc";
downcountlist = pageDAO.queryByPage(10, pageNow, "from soft sft order by sft.fDownTimes desc");
pageDAO.UpdatefgoodAndfbad(getId(), "updatebad", fbadcount);
} else {
returnstr = "erro";
}
softs = pageDAO.queryByPage(pageSize, pageNow, HQLstr);
System.out.println(softs.size());
return returnstr;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the downcountlist
*/
public List<soft> getDowncountlist() {
return downcountlist;
}
/**
* @param downcountlist the downcountlist to set
*/
public void setDowncountlist(List<soft> downcountlist) {
this.downcountlist = downcountlist;
}
/**
* @return the fbadcount
*/
public String getFbadcount() {
return fbadcount;
}
/**
* @param fbadcount the fbadcount to set
*/
public void setFbadcount(String fbadcount) {
Integer b = Integer.valueOf(fbadcount) + 1;
this.fbadcount = b.toString();
}
/**
* @return the fgoodcount
*/
public String getFgoodcount() {
return fgoodcount;
}
/**
* @param fgoodcount the fgoodcount to set
*/
public void setFgoodcount(String fgoodcount) {
Integer b = Integer.valueOf(fgoodcount) + 1;
this.fgoodcount = b.toString();
}
/**
* @return the leavatalks
*/
public List<leavetalk> getLeavatalks() {
return leavatalks;
}
/**
* @param leavatalks the leavatalks to set
*/
public void setLeavatalks(List<leavetalk> leavatalks) {
this.leavatalks = leavatalks;
}
}
第八步:配置ACTION 文件STRUTS.xml的代码如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="example.xml"/>
<!-- Configuration for the default package. -->
<package name="default" extends="struts-default">
<action name="softlist" class="com.action.softlistAction">
<result name="SUCCESS">test.jsp</result>
<result name="error">error.jsp</result>
</action>
</package>
</struts>
第九步:建立JSP文件 来享受结果了
test.jsp代码如下:
< import="java.sql.ResultSet"%>
< import="java.util.List"%>
< contentType="text/html"%>
< import="org.apache.struts2.ServletActionContext"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<script language="javascript" type="text/javascript">
<%
String PageNow = request.getAttribute("pageNow").toString();
String pageCount = request.getAttribute("pageCount").toString();
%>
</script>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>分页测试</title>
</head>
<table style=" border: 2px">
<s:iterator value="softs">
<td><s:property value="fSoftname"/></td>
<td><s:property value="fUsedSystem"/></td>
<td><s:property value="fUpdateTime"/></td>
</s:iterator>
</table>
<div>
<ul><li><a href=¹softlist.action?pageNow=1¹>首页</a></li>
<li><a href=¹softlist.action?pageNow=<s:property value="%{PageNow-1}"/>¹> 上一页</a></li>
<li><a href=¹softlist.action?pageNow=<s:property value="%{PageNow+1}"/>¹>下一页</a></li>
<li><a href=¹softlist.action?pageNow=<%=pageCount%>¹>末页</a></li>
<li><span class="pageinfo">第<strong><s:property value="#request.pageNow"/></strong>页</span></li>
<li><span class="pageinfo">共<strong><s:property value="#request.pageCount"/></strong>页</span></li>
</ul></div>
<body>
</body>
</html>
第十步:建立link.jsp
代码:
<%--
Document : link
Created on : 2011-1-24, 18:42:14
Author : Even
--%>
< contentType="text/html" pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>JSP Page</title>
</head>
<body>
<h1><a href="softlist.action">单击显示效果</a></h1>
</body>
</html>
注意:后面的演示我是重新制作的页面不是我的网站页面效果所以只是完成了一个原理而已,网上很多 STRUTS2的分页文章没有一个完整的。这里面的分页原理用的是 session里面的记录集查询中的 setFirstResult和setMaxResults,关于算法大家自己去揣摩就是了很简单。
来自: http://hi.baidu.com/sunnywfg/blog/item/4aa5a563acbe5e730d33fa3f.html
Java通过JDBC调用MYSQL存储过程实现分页
本文的代码讲解Java通过JDBC调用MYSQL存储过程实现分页,存储过程的一个特点是运行效率较高。
- import java.sql.CallableStatement;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import org.junit.Test;
- public class Test2 {
- @Test
- public void test() throws SQLException {
- Connection conn = null;
- ResultSet rs = null;
- CallableStatement cstmt = null;
- try {
- Class.forName("com.mysql.jdbc.Driver");
- conn = DriverManager.getConnection(
- "jdbc:mysql://localhost/test",
- "root", "root");
- cstmt = conn.prepareCall("{call pro_pager(?,?,?,?,?)}");
- cstmt.setInt(1, 111111111);
- cstmt.setInt(2, 1);
- cstmt.setString(3, "select * from student");
- cstmt.registerOutParameter(4, 1);
- cstmt.registerOutParameter(5, 1);
- cstmt.execute();
- System.out.println("共" + cstmt.getObject(4) + "条");
- System.out.println("共" + cstmt.getObject(5) + "页");
- rs = cstmt.getResultSet();
- while (rs.next()) {
- System.out.print(rs.getString("id") + "----");
- System.out.print(rs.getString("name") + "----");
- System.out.println(rs.getString("age"));
- }
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- cstmt.close();
- conn.close();
- }
- }
- }
Jdbc操作
- package cn.org.jshuwei.j2ee.util;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.sql.SQLException;
- import java.sql.Statement;
- /**
- *
- * Jdbc操作的工具类
- *
- * @author huwei(jshuwei.org.cn)
- * @since 1.0
- *
- */
- public class JdbcUtil {
- static {
- try {
- Class.forName("oracle.jdbc.driver.OracleDriver");
- Class.forName("com.mysql.jdbc.Driver");
- Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- /**
- * 得到Connection
- *
- * @since 1.0
- * @param dbType
- * 数据库类型(oracle/mysql)
- * @return 返回Connection
- */
- public static Connection getConnection(String dbType) {
- String url = "";
- String user = "";
- String password = "";
- if (dbType.equals("oracle")) {
- url = "jdbc:oracle:thin:@localhost:6666:XE";
- user = "jshuwei";
- password = "123456";
- }
- if (dbType.equals("mysql")) {
- url = "jdbc:mysql://localhost:3306/test";
- user = "jshuwei";
- password = "123456";
- }
- if (dbType.equals("sqlServer")) {
- url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_test";
- user = "jshuwei";
- password = "123456";
- }
- try {
- return DriverManager.getConnection(url, user, password);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 打印记录集对象
- *
- * @since 1.0
- * @param rs
- * 需要打印的记录集对象
- */
- public static void printRs(ResultSet rs) {
- if (rs == null) {
- System.out.println("ResultSet is null!");
- return;
- }
- try {
- ResultSetMetaData md = rs.getMetaData();
- int cols = md.getColumnCount();
- for (int i = 1; i <= cols; i++) {
- // 列名,类型编号,类型名称
- System.out
- .println(md.getColumnName(i) + "-->"
- + md.getColumnType(i) + "-->"
- + md.getColumnTypeName(i));
- }
- System.out.println("=========================================");
- while (rs.next()) {
- for (int i = 1; i <= cols; i++) {
- System.out.println(md.getColumnName(i) + "="
- + rs.getString(i) + " ");
- }
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- /**
- * 释放资源
- *
- * @since 1.0
- * @param rs
- * 需要释放的记录集对象
- * @param stmt
- * 需要释放的Statement对象
- * @param con
- * 需要释放的连接对象
- */
- public static void release(ResultSet rs, Statement stmt, Connection con) {
- if (rs != null)
- try {
- rs.close();
- } catch (Exception e) {
- }
- if (stmt != null)
- try {
- stmt.close();
- } catch (Exception e) {
- }
- if (con != null)
- try {
- con.close();
- } catch (Exception e) {
- }
- }
- /**
- * 释放资源
- *
- * @since 1.0
- * @param o
- * 需要释放的对象
- */
- public static void release(Object o) {
- try {
- if (o instanceof ResultSet) {
- ((ResultSet) o).close();
- } else if (o instanceof Statement) {
- ((Statement) o).close();
- } else if (o instanceof Connection) {
- ((Connection) o).close();
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
Java Web Cookie
- package cn.org.jshuwei.j2ee.util;
- import javax.servlet.http.Cookie;
- import javax.servlet.http.HttpServletResponse;
- /**
- *
- * Cookie操作的工具类
- *
- * @author huwei(jshuwei.org.cn)
- * @since 1.0
- *
- */
- public class CookieUtil {
- /**
- *
- * 查找cookie
- *
- * @since 1.0
- * @param name
- * cookie名称
- * @param cookies
- * 客户端cookie
- * @return Cookie
- *
- */
- public static Cookie FindCookie(String name, Cookie[] cookies) {
- if (cookies != null) {
- for (Cookie cookie : cookies) {
- if (cookie.getName().equals(name)) {
- return cookie;
- }
- }
- }
- return null;
- }
- /**
- *
- * 删除cookie
- *
- * @since 1.0
- * @param cookie
- * 需要删除的某个cookie
- * @param response
- * 响应对象
- *
- */
- public static void DeleteCookie(Cookie cookie, HttpServletResponse response) {
- if (cookie != null) {
- cookie.setMaxAge(0);
- response.addCookie(cookie);
- }
- }
- /**
- *
- * 保存cookie
- *
- * @since 1.0
- * @param cookie
- * 需要保存的cookie
- * @param response
- * 响应对象
- *
- */
- public static void SaveCookie(Cookie cookie, HttpServletResponse response) {
- response.addCookie(cookie);
- }
- }
探秘Servlet 3.0中的Web安全改进
Servlet 3.0最为最新的Servlet最新标准,其提供了很多新特性,比如异步请求处理、声明式语法支持等。在这里我们将考察Servlet 3.0安全方面的增强。
对网站进行跨站攻击最常用的一个手段就是在网页中插入恶意的Html和JavaScript代码。一旦你的网页被增加这些恶意代码,那么就非常容易泄流你的个人信息,比如Cookie。
Cookie作为保留会话状态的手段,经常被用来保存用户登录信息等敏感性数据,但是由于Cookie既可以在服务器端读取,又可以在客户端通过脚本读取,则导致其成为Web应用安全的一个薄弱环节。
在2002年,微软采用了一种被称为“HttpOnly Cookies”的技术,来防止恶意读取Cookie信息。该技术实际并不复杂,只是在Cookie上增加一个额外的属性,在浏览器支持的情况下,如果尝试通过脚本读取Cookie内容,返回结果将为空。现在大多数服务器和客户端都采用的是这种技术,当然浏览对对XMLHttpRequest对象进行了特殊处理。
在Servlet 3.0规范中,Java Servlet开始支持“HttpOnly Cookies”。当使用HttpServletResponse的addCookie方法,向浏览器提供Cookie的时候,可以通过Cookie对象的setHttpOnly方法指定Cookie为HttpOnly。例如:
Cookie cooki=new Cookie("user_name","guandeliang"); cooki.setMaxAge(60*60*24*365); cooki.setPath("/"); cooki.setHttpOnly(true); response.addCookie(cooki); |
另外,如果希望判断一个Cookie对象是否是HttpOnly,可以通过调用该对象的isHttpOnly()进行判断。
Java几个过滤器学习技巧
import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 用于的使 Browser 不缓存页面的过滤器 */ public class ForceNoCacheFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { ((HttpServletResponse) response).setHeader("Cache-Control","no-cache"); ((HttpServletResponse) response).setHeader("Pragma","no-cache"); ((HttpServletResponse) response).setDateHeader ("Expires", -1); filterChain.doFilter(request, response); } public void destroy() { } public void init(FilterConfig filterConfig) throws ServletException { } } import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.List; import java.util.ArrayList; import java.util.StringTokenizer; import java.io.IOException; /** * 用于检测用户是否登陆的过滤器,如果未登录,则重定向到指的登录页面 * 配置参数 * checkSessionKey 需检查的在 Session 中保存的关键字 * redirectURL 如果用户未登录,则重定向到指定的页面,URL不包括 ContextPath * notCheckURLList 不做检查的URL列表,以分号分开,并且 URL 中不包括 ContextPath */ public class CheckLoginFilter implements Filter { protected FilterConfig filterConfig = null; private String redirectURL = null; private List notCheckURLList = new ArrayList(); private String sessionKey = null; public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); if(sessionKey == null) { filterChain.doFilter(request, response); return; } if((!checkRequestURIIntNotFilterList(request)) && session.getAttribute(sessionKey) == null) { response.sendRedirect(request.getContextPath() + redirectURL); return; } filterChain.doFilter(servletRequest, servletResponse); } public void destroy() { notCheckURLList.clear(); } private boolean checkRequestURIIntNotFilterList(HttpServletRequest request) { String uri = request.getServletPath() + (request.getPathInfo() == null ? "" : request.getPathInfo()); return notCheckURLList.contains(uri); } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; redirectURL = filterConfig.getInitParameter("redirectURL"); sessionKey = filterConfig.getInitParameter("checkSessionKey"); String notCheckURLListStr = filterConfig.getInitParameter("notCheckURLList"); if(notCheckURLListStr != null) { StringTokenizer st = new StringTokenizer(notCheckURLListStr, ";"); notCheckURLList.clear(); while(st.hasMoreTokens()) { notCheckURLList.add(st.nextToken()); } } } } import javax.servlet.*; import java.io.IOException; /** * 用于设置 HTTP 请求字符编码的过滤器,通过过滤器参数encoding指明使用何种字符编码,用于处理Html Form请求参数的中文问题 */ public class CharacterEncodingFilter implements Filter { protected FilterConfig filterConfig = null; protected String encoding = ""; public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if(encoding != null) servletRequest.setCharacterEncoding(encoding); filterChain.doFilter(servletRequest, servletResponse); } public void destroy() { filterConfig = null; encoding = null; } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); } } |
Servlet中实现四位数字验证码
以下为在Servlet中实现四位数字验证码的源码分析。 import java.awt.image.*;
import com.sun.image.codec.jpeg.*; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import java.awt.*; /* * 功能:调用AuthCodeServlet可以生成一个4位数字的验证码图片,验证码的图片宽度和高度可以通过配置文件进行定义 * 验证码调用格式为: /servlet/AuthCodeServlet?w=78&h=32 * 或者使用默认长宽/servlet/AuthCodeServlet */ public class AuthCodeServlet extends HttpServlet { // 处理post public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException { doGet(req,res); } //设置字体 private Font mFont=new Font("Times New Roman", Font.PLAIN,16); public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { HttpSession session=request.getSession(); response.setContentType("image/gif"); response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); int width=70; //验证码默认长度 int height=24; //验证码默认宽度 if(request.getParameter("w")!=null && !request.getParameter("w").equals("")) width = Integer.parseInt(request.getParameter("w")); if(request.getParameter("h")!=null && !request.getParameter("h").equals("")) height = Integer.parseInt(request.getParameter("h")); ServletOutputStream out=response.getOutputStream(); //获取输出流 BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //新建验证图片,并设置验证码图片的大小 Graphics gra=image.getGraphics(); //获取图形上下文 Random random=new Random(); gra.setColor(getRandColor(260,210)); //设置验证码的图片背景色 gra.fillRect(0,0,width,height); gra.setColor(Color.BLUE); //设置字体色为蓝色 gra.setFont(mFont); //设置定义的字体格式 // 随机产生254条干扰直线,使图象中的验证码不易被解析程序分析到 gra.setColor(getRandColor(110,240)); for (int i=0;i<254;i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(63); int yl = random.nextInt(64); gra.drawLine(x,y,x+xl,y+yl); } // 取随机产生的验证码(4位数字) String sRand=""; for (int i=0;i<4;i++){ String rand=String.valueOf(random.nextInt(353)); sRand+=rand; // 将认证码显示到图象中 gra.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); //调用随机函数构建随机颜色三素 gra.drawString(rand,13*i+6,16); } session.setAttribute("authCode",sRand); JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out); encoder.encode(image); } static Color getRandColor(int ff,int cc){ //给定范围获得随机颜色 Random random = new Random(); if(fc>255) ff=255; if(bc>255) cc=255; int r=ff+random.nextInt(cc-ff); int g=ff+random.nextInt(cc-ff); int b=ff+random.nextInt(cc-ff); return new Color(r,g,b); } static public String getAuthCode(HttpSession session){ //返回验证码 return (String)session.getAttribute("AuthCode"); } } |
分享基于J2EE的Web可视化开发工具
这是一款跨平台、数据库和浏览器的Web应用开发和部署平台,可以在您原有使用的技术框架上混合使用,可以使用Eclipse开发调试。这个版本是没有任何限制的正式完全版本。
该软件能提高应用系统的开发效率,并降低成本。完善的基础架构,具有应用系统必须的完整功能,使企业仅致力于业务的开发。
软件的功能如下:
应用开发:提供可视化的WebBuilder集成开发环境,帮助应用系统的快速开发,支持使用Eclipse等开发工具的开发和调试。
应用部署:使用基于Web的资源管理器进行应用的部署,支持Java,.Net,PHP等大部分Web应用的部署。
应用描述语言:基于XML的Web应用描述语言,屏蔽不同平台、数据库和浏览器之间的差异。
完整的组件框架:提供应用开发所需的经过封装的前后台组件、开发框架以及应用模块。
另外是一个基于WebBuilder开发的基于web的资源管理器,可方便管理服务器上的文件系统,支持国际化,非常适合远程管理服务器上的文件,上传下载等,分享给大家。
Java EE 6核心特征:Bean Validation解析
Bean Validation是Java EE 6数据验证新框架,Validation API并不依赖特定的应用层或是编程模型,这样同一套验证可由应用的所有层共享。它还提供了通过扩展Validation API来增加客户化验证约束的机制以及查询约束元数据仓库的手段。
在Java EE 6的Bean Validation出现之前,开发者不得不在表示层框架、业务层以及持久层中编写验证规则以保证这些规则的同步性,但这么做非常浪费时间而且极易出错。Bean Validation是通过约束实现的,这些约束以注解的形式出现,注解可以放在JavaBean(如backing bean)的属性、方法或是类上面。约束既可以是内建的注解(位于javax.validation.constraints包下面),也可以由用户定义。一些常用的内建注解列举如下:
◆Min:被@Min所注解的元素必须是个数字,其值要大于或等于给定的最小值。
◆Max:被@Max所注解的元素必须是个数字,其值要小于或等于给定的最大值。
◆Size:@Size表示被注解的元素必须位于给定的最小值和最大值之间。支持Size验证的数据类型有String、Collection(计算集合的大小)、Map以及数组。
◆NotNull:@NotNull确保被注解的元素不能为null。
◆Null:@Null确保被注解的元素一定为null。
◆Pattern:@Pattern确保被注解的元素(String)一定会匹配给定的Java正则表达式。
代码中通过Bean Validation注解声明了一些约束:
public class Address { @NotNull @Size(max=30) private String addressline1; @Size(max=30) private String addressline2; public String getAddressline1() { return addressline1; } public void setAddressline1(String addressline1) { this.addressline1 = addressline1; } } |
@NotNull指定被注解的元素addressline1不能为null;@Size指定被注解的元素addressline1和addressline2不能超过给定的最大值,即30个字符。
在验证Address对象时,addressline1的值被传递到针对@NotNull约束的验证类以及针对@Size约束的验证类中,而addressline2的值被传递到针对@Size约束的验证类中,由相关的验证类进行验证。如下代码自定义了一个名为ZipCode的约束:
@Size(min=5, max=5)
@ConstraintValidator(ZipcodeValidator.class)
@Documented
@Target({ANNOTATION_TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface ZipCode {
String message() default "Wrong zipcode";
String[] groups() default {};
}
可以将@ZipCode用在类、属性或是方法上,就像其他约束一样。
public class Address {
@ZipCode
private String zipCode;
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
Validation API
开发者可以借助于Validation API以编程的方式验证JavaBean。Bean Validation API的默认包是javax.validation。下面对该包中的一些类进行说明:
ConstraintValidator:这是一个接口,具体的约束验证类需要实现该接口。该接口定义了相关的逻辑以验证给定对象类型中的约束。
Validator:Validahttp://java.sun.com/javaee/6/docs/api/index.html?javax/validation/Validator.htmltor接口持有对象验证图的契约。该接口的实现必须是线程安全的。
ConstraintViolation:ConstraintViolation接口表示给定bean上的约束验证失败,它公开了约束违背上下文以及描述该违背情况的信息。
ValidationException:如果在验证过程中出现了某些不可恢复的错误就会抛出ValidationException异常。某些情况下可以指定该异常,如不合法的分组(group)定义、不合法的约束定义以及不合法的约束声明等等。
约束元数据请求API
Bean Validation规范提供了查询约束仓库的手段。该API主要用于工具支持和与其他框架、库以及JSR的集成。Bean Validation规范旨在为对象约束提供一个验证引擎和元数据仓库。需要进行约束定义、验证和元数据的框架(Java EE或Java SE)可以利用Bean Validation规范完成这些功能,从应用或是基础设施的角度来看,这么做可以避免不必要的重复工作。
Bean Validation已经集成到了JSF 2.0和JPA 2.0中。在JSF中可以将表单输入域与域对象的属性绑定起来。JSF 2和Bean Validation可以判断出绑定的是哪个属性并执行与之相关的验证,还会将约束违背的信息显示给用户。Hibernate Validator 4是Bean Validation规范的参考实现框架,其最新版增加了不少新特性,如分组验证、与JPA 2和JSF 2的自然集成以及扩展的注解集等等。
- 默认分类(20)
- J2EE(25)
- Java(56)
- PHP(55)
- SEO(10)
- 网页设计(20)
- 网站建设(37)
- 数据库(7)
- JavaScript(17)
- JQuery(6)
- MySQL(20)
- SQL Server(6)
- Access(1)
- Oracle(6)
- office(6)
- Dreamweaver(4)
- Photoshop(12)
- Flash(9)
- Fireworks(13)
- CSS(14)
- HTML(4)
- .NET(7)
- ASP(2)
- DB2(1)
- Ajax(2)
- Linux(12)
- Struts(7)
- Hibernate(8)
- Spring(2)
- Jsp(22)
- Asp(8)
- C#(3)
- C++(1)
- 网络安全(5)
- 软件工程(7)
- XML(1)
- English(2)
- 计算机等级考试(2)
- 计算机病毒(4)
- 个人日志(76)
- 互联网(15)
- ActionScript(10)
- Android(3)
- 数据结构与算法(1)
- 游戏策略(3)
- 美文翻译(2)
- 编程开发(19)
- 计算机应用(4)
- 计算机(10)
- Unity3d(6)
- 其他(1)
- egret(1)