qqjianyue代码工

砌java代码
posts - 62, comments - 9, trackbacks - 0, articles - 10
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

ZIP压缩IO涉及类(包括操作文件夹压缩)

ZipEntry标识zip文件中单个文件的入口,它也支持路径加文件名,所以通过配置它,可以建立目录层次的zip文件(见下例子)

ZipOutputStreamwrite数据到zip文件的对象

ZipInputStream,从zip文件中read数据的对象,其实基本上这个没有作用

ZipFile,获取zip文件里面单个文件入口,getInputStream()等信息的对象,初始化ZipFile zf = new ZipFile(zip压缩文件的File对象);

           Enumeration entries = =zf.entries()可以获得所有的zip文件里面的文件入口。

原理就是:entry指定单个文件相对zip压缩文件内部根目录的位置,Stream操作输出输入,ZipFile代表的就是整个zip文件


示例代码

JAR压缩类与ZIP是几乎一模一样对应的分别为:JarEntry JarFile JarInputStream JarOutputStream

GZIP格式,只提供GZIPInputStream和GZIPOutputStream类,因为其作用是单纯的压缩与解压,不维护文件结构。多数用于基于流的数据传送过程实现数据压缩。用法就如Bufer Stream一样,是stream之间的又一个过滤类,只是Buffer提供缓冲,而GZIP提供压缩。
例如需要网络传送压缩就可以这样做:
客户端:
Socket socket = new Socket(服务器地址字符串, 服务器端口);
BufferOutputStream out = new BufferOutPutStream(new GZIPOutputStream(socket.getOutputStream()));
然后就可以操作数据输出了
服务器端:
ServerSocket sSocket =   new ServerSocket(服务器端口);
Socket socket = sSocket.accept();
BufferInputStream in = new BufferInputStream(new GZIPInputStream(socket.getInputStream()));
然后就可以读入数据了。
明显网络数据传送就加了一个压缩,性能就可以提高了。

posted @ 2008-10-07 14:15 Qzi 阅读(1708) | 评论 (0)编辑 收藏

     摘要: 元字符

\w 匹配字母或数字或下划线或汉字等。等效于Unicode字符类别 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]。如果用ECMAScript选项指定了符合 ECMAScript的行为,则\w只等效于[a-zA-Z_0-9]。

\b 单词的开头或结尾,如果需要更精确的说法,\b匹配这样的位置:它的前一个字符和后一个字符不全是\w

. 除换行符以外的所有字符

* 表示数量,任意数量,所以 .* 加起来就表示除换行符以外的任意数量字符,\w*表示任意字符

+ 是和*类似的元字符,不同的是*匹配重复任意次(可能是0次),而+则匹配重复1次或更多次。

\d 单个数字

\s 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。

^ 匹配你要用来查找的字符串的开头,$匹配结尾。和忽略大小写的选项类似,有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项,^和$的意义就变成了匹配  阅读全文

posted @ 2008-10-04 20:00 Qzi 阅读(801) | 评论 (0)编辑 收藏

Pattern类:
例子:
        Pattern pattern = Pattern.compile("[,\\s]+");
        String[] result = pattern.split("one two three,four,five, six");
        for(int i = 0; i<result.length; i++){
            System.out.println(result[i]);
        }
输出结果是:
one
two
three
four
five
six
Pattern类的静态方法compile用来编译正则表达式,在此[,\\s]+表示若干个","或者若干个空格匹配
split方法使用正则匹配将字符串切割成各子串并且返回

Matcher类:
注意,Matcher的获得是通过Pattern.matcher(CharSequence charSequence);输入必须是实现了CharSequence接口的类
常用方法:
matches()判断整个输入串是否匹配,整个匹配则返回true
例如下面会输出true
        String str1 = "hello";
        Pattern pattern1 = Pattern.compile("hello");
        Matcher matcher1 = pattern1.matcher(str1);
        System.out.println(matcher1.matches());

lookingAt()从头开始寻找,找到匹配则返回true
例如下面会输出true
        String str2 = "hello yangfan!";
        Pattern pattern2 = Pattern.compile("hello");
        Matcher matcher2 = pattern2.matcher(str2);
        System.out.println(matcher2.lookingAt());

find()扫描输入串,寻找下一个匹配子串,存在则返回true
例如下面将会将所有no替换成yes
        Pattern pattern = Pattern.compile("no");
        Matcher matcher = pattern.matcher("Does jianyue love yangfan? no;" +
                "Does jianyue love yangfan? no;Does jianyue love yangfan? no;");
        StringBuffer sb = new StringBuffer();
        boolean find = matcher.find();
        while(find){
            matcher.appendReplacement(sb, "yes");
            find = matcher.find();
        }
        matcher.appendTail(sb);
        System.out.println(sb.toString());

posted @ 2008-10-04 19:50 Qzi 阅读(1039) | 评论 (0)编辑 收藏

初始化:
StringTokenizer st = new StringTokenizer(String str);
默认的分隔符,即空白符(空格、制表符、回车)
或者
StringTokenizer st = new StringTokenizer(String str, String token);
使用token作为分隔符

常用函数:
st.countTokens()返回token的数量
st.hasMOreTokens()判断时候当前位置之后是否还有token
st.nextToken()返回当前位置到下一个token之前或者字符串结束之前的字符串

简单示例:
        String str = "wo shi li jian yue, what your name? yangfan?";
        String[] stringArray = new String[100];
        StringTokenizer st = new StringTokenizer(str, ",");
        int i;
        for(i = 0; st.hasMoreTokens(); i++){
            stringArray[i] = st.nextToken();
        }
        for(int j = 0; j<i; j++){
            System.out.println(stringArray[j]);
        }
以","为分隔符,将会输出","之前和之后的两行字符串

posted @ 2008-10-04 18:01 Qzi 阅读(245) | 评论 (0)编辑 收藏

 

创建 Filter(过滤器)

 实际开发中都需要开发一些很有用的过滤器,来解决中文表单提交问题啊,给请求和响

应加入 GZIP压缩功能啊,用户权限控制啊,等等,然而遗憾的 MyEclipse不支持直接创建

过滤器。在这里只好手工创建一个解决 Tomcat表单提交中文问题的过滤器。

 选择菜单 File > New > Class,来创建一个名为 TomcatFormFilter 的类,包名为

filters。然后把类的代码修改为如下所示:

package filters;

import java.io.IOException;

import javax.servlet.Filter;

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.HttpServletRequestWrapper;

public class TomcatFormFilter implements Filter {

 /**

   * Request.java

   * HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所

有的 HttpServletRequest

   * 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只

需要用新的 Request 对象替换页面中的

   * request 对象即可.

   */

 class Request extends HttpServletRequestWrapper

 {

      public Request(HttpServletRequest request) {

        super(request);

      }

   /**

   * 转换由表单读取的数据的内码.

   * ISO 字符转到 GBK.

   */

   public String toChi(String input) {

      try {

          byte[] bytes = input.getBytes("ISO8859-1");

          return new String(bytes, "GBK");

        }

      catch (Exception ex) {

        }

      return null;

 }

      /**

       * Return the HttpServletRequest holded by this object.

       */

      private HttpServletRequest getHttpServletRequest()

      {

          return (HttpServletRequest)super.getRequest();

      }

   /**

   * 读取参数 -- 修正了中文问题.

   */

      public String getParameter(String name)

      {

        return

toChi(getHttpServletRequest().getParameter(name));

      }

   /**

   * 读取参数列表 - 修正了中文问题.

   */

      public String[] getParameterValues(String name)

      {

          String values[] =

getHttpServletRequest().getParameterValues(name);

          if (values != null) {

            for (int i = 0; i < values.length; i++) {

              values[i] = toChi(values[i]);

            }

          }

          return values;

      }

 }

 public void destroy() {

 }

 public void doFilter(ServletRequest request, ServletResponse

response,

   FilterChain chain) throws IOException, ServletException {

    HttpServletRequest httpreq = (HttpServletRequest)request;

   if(httpreq.getMethod().equals("POST")) {

   request.setCharacterEncoding("GBK");

 } else {

   request = new Request(httpreq);

 }

 chain.doFilter(request, response);

 }

 public void init(FilterConfig filterConfig) throws

ServletException {

 }

}

清单 8.5 过滤器代码

然后修改 web.xml 加入 Servlet 定义,修改后的代码清单如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" 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_2_5.xsd">

 <servlet>

   <description>

      This is the description of my J2EE component

   </description>

   <display-name>

      This is the display name of my J2EE component

   </display-name>

   <servlet-name>LoginServlet</servlet-name>

   <servlet-class>servlets.LoginServlet</servlet-class>

 </servlet>

 <filter>

   <filter-name>TomcatFormFilter</filter-name>

   <filter-class>filters.TomcatFormFilter</filter-class>

 </filter>

 <filter-mapping>

   <filter-name>TomcatFormFilter</filter-name>

   <url-pattern>/*</url-pattern>

 </filter-mapping>

 <servlet-mapping>

   <servlet-name>LoginServlet</servlet-name>

   <url-pattern>/login.aspx</url-pattern>

 </servlet-mapping>

 <welcome-file-list>

   <welcome-file>index.jsp</welcome-file>

 </welcome-file-list>

</web-app>

清单 8.6加入了过滤器的 web.xml 内容

清单中的粗斜体部分就是新加入的过滤器的映射信息。

posted @ 2008-10-01 09:52 Qzi 阅读(2449) | 评论 (1)编辑 收藏

一.继承关系和关联聚集关系映射
1.整个类层次使用一张表
2.每个叶结点使用一张表,该表保存了该类自己的和所继承的所有属性
3.每个类使用一张表,该表只保存OID以及对应类自己的属性(不含所继承的属性)

1.“1对1”或“1对多”关系的映射,简单地利用外键即可
2.“多对多”关系的映射,引入一个新的表,专门记录这种“多对多”关系

二.编程步骤:事前准备包括建立一个project并且加入外部库
新建一个Project HibernateSample,然后在Project上点右键,选择Properties  Java Build Path  Libraries。选择Add External JARs,然后将Hibernate目录下的hibernate3.jar,以及Hibernate目录下的lib文件夹中所有的jar文件添加进来。
另外我们还必须有MySQL的JDBC驱动,用上面的办法同样把mysql-connector-java-3.1.12-bin.jar添加进我们的Build Path中。

1.创建数据库(例如User表)
2.建立对应数据库的类的属性与操作(例如User类)
3.编写映射数据库表hibernate mapping,命名为***.hbm.xml(例如User.hbm.xml)
<?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="sample.User" table="user">
  <id name="id" column="id" type="java.lang.Integer">
   <generator class="native" />
  </id>
  <property name="name" column="name" type="java.lang.String" />
  <property name="age" column="age" type="java.lang.Integer" />
 </class>
</hibernate-mapping>
明显可见关注点包括
A)class中包中的类与数据库中table的对应
B)property中 类中ID和属性与table中字段的对应

4.编写Hibernate配置文件hibernate configurarion file,通常命名:
<?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>
  <!-- 是否显示实际操作数据库时的SQL -->
  <property name="show_sql">true</property>
  <!-- SQL方言,这边设定的是MySQL -->
  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <!-- JDBC驱动程序 -->
  <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  <!-- JDBC URL -->
  <property name="connection.url">jdbc:mysql://localhost/Sample</property>
  <!-- 数据库用户名 -->
  <property name="connection.username">root</property>
  <!-- 数据库密码 -->
  <property name="connection.password">123456</property>
  <!-- 以下设置对象与数据库表格映像文件 -->
  <mapping resource="sample/User.hbm.xml"/>
 </session-factory>
</hibernate-configuration>
关注点包括:
A)数据库路径, 数据库用户名, 数据库密码,
B)还有就是指定数据库映射文件mapping resource

5.配置log4j.properties
在src目录下点右键,选择import,然后选择General  File System,接着选择Hibernate文件夹下的etc文件夹,再选择log4j.properties文件,最后选择Finish。
关键配置文件:
hbm是映射配置
cfg是密码,用户,以及hbm指定配置
properties是用于配置当前数据库连接的属性配置

6.编程操作数据库过程
使用对象增加数据项:
A)Configuration配置Configuration config = new Configuration().configure();
B)Session工厂获得SessionFactory sessionFactory = config.buildSessionFactory();
C)Session获得Session session = sessionFactory.openSession();
D)Transaction事务启动Transaction tx = session.beginTransaction();
E)建立映射数据的实体类(例如User的一个实例)
F)session操作(例如session.save(user)插入到数据库一个user的对象)
G)关键的Transaction事务提交,tx.commit();
H)清理包括Transaction对象,session对象,sessionFactory对象的有顺序清理

使用Criteria查询数据
A)配置Configuration,SessionFactory,Session与上面相同
B)创建Criteria criteria=session.createCriteria(User.class);
C)创建User列表List users = criteria.list();
D)使用迭代器Iterator iterator = users.iterator();
E)iterator.hasNext(),iterator.next()的使用
F)criteria.add(Expression.eq("name","hibernateUser2"));加上查询约束
G)users = criteria.list();将会按照查询约束得到列表.

使用鼓励的HQL的Query查询
A)创建Query例如Query query = session.createQuery("from User");
B)获得数据List uers = query.list();
C)遍历器使用Iterator iterator = users.iterator();又如iterator.hasNext();和iterator.next();
D)使用过滤查询
query = session.createQuery("from User user where user.name like ?");
query.setParameter(0, "hibernateUser2");Query的setParameter()方法第一个参数是指定 ? 出现的位置,从 0 开始,第二个参数则是设定查询条件。
然后再List uers = query.list();获得的将是满足username==hibernateUser2的条件的结果
E)清除session和sessionFactory使用close方法.


hibernate_rar

posted @ 2008-10-01 09:49 Qzi 阅读(306) | 评论 (0)编辑 收藏

  • validate: validate the project is correct and all necessary information is available
  • compile: compile the source code of the project
  • test: test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
  • package: take the compiled code and package it in its distributable format, such as a JAR.
  • integration-test: process and deploy the package if necessary into an environment where integration tests can be run
  • verify: run any checks to verify the package is valid and meets quality criteria
  • install: install the package into the local repository, for use as a dependency in other projects locally
  • deploy: done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

There are two other Maven lifecycles of note beyond the default list above. They are

  • clean: cleans up artifacts created by prior builds
  • site: generates site documentation for this project

官网文章:http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

posted @ 2008-09-16 17:06 Qzi 阅读(458) | 评论 (0)编辑 收藏

参考站点:都是英文站点。
第一步站:http://www.eclipse.org/subversive/downloads.php
里面会有介绍安装的总领式介绍,他说需要两个升级来支持这个插件,一个在本站可下,一个需要在外部站点下。
其中提供三个版本release,他推荐使用第二个。
第二步站:http://www.eclipse.org/subversive/documentation/gettingStarted/aboutSubversive/install.php
详细的安装步骤,是按照Ganymede Release介绍的,其实将那几个update site改成Latest Release的update site选上相同的
包,也是一样的。但是注意:
最后一个Subversive Integration Plug-in's就不要好啦,要了也装不上,会报依赖不满足的不能安装的
第三步站:http://www.polarion.com/products/svn/subversive.php?src=eclipseproject
这个就是外部的提供另一个站点,提供connetor和Integration Plug-in's(装不上)的站点。

我用到的update site是:http://download.eclipse.org/technology/subversive/0.7/update-site/
http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/

http://www.polarion.org/projects/subversive/download/integrations/update-site/ 这个也用不上,其实

posted @ 2008-09-05 11:07 Qzi 阅读(1240) | 评论 (0)编辑 收藏

1 String lastUrl = request.getHeader("Referer");
不好意思,下面的说错了(所以都标红了),不过的确这个方法在有框架的时候性能还不清楚,
貌似是:
在多个框架中,IE的情况是:如果将在frame触发的链接显示在frame2中,frame2的Referer就不会改变。firefox的情况是,会变,所以firefox处理的更好。
请有识之士教导。

使用到方法来获得上一次路径的请注意了,如果页面涉及到框架frame的话,请留意firefox与IE的不同。

假如页面具有整个页面,上,左,右三个frame四个所谓的windows,假设每一个frame都有自己地址栏,当然真实的地址栏只有整个页面的一个。
我出现的情况是:
1)firefox中:一个右frame的jsp页面进入的struts的action,在这个action使用这个函数,能够获得右frame地址栏原来的字符串。在右frame页面里使用这个函数,也能够获得右frame原来的地址栏的字符串。 算是比较正常吧,获得所谓的referer的字符串嘛。
2)IE中:一个右frame的jsp页面进入的一个action,使用这个函数,获得的是整个页面的地址栏原来的字符串。在右frame页面里使用这个函数,却获得的是右frame地址栏原来的字符串。 这样就不正常啦,我在action里使用获得的竟然是整个页面的地址栏原来的字符串,那样我new ActionForward(这个url)的时候,就会出现框架嵌套框架啦。


这些问题应该是跟浏览器的实现有关。

我用这个函数主要是想实现返回上一步的功能。但是上一步的路径获得那么可预测,这种方法获得之前页面看来是不能信赖地用的。

posted @ 2008-09-02 16:41 Qzi 阅读(311) | 评论 (0)编辑 收藏

下面的stirng对象变量都缩写成str

四个方法search,split,replace, match

详细解说

search用法:str.search("子串")

如果str中存在子串,则返回子串开头字符在str中的索引(即位置,当然是0或者正数),若str中不存在匹配子串则返回-1

例如:"JavaScript regular expressions are powerful!".search("pow")返回的是35,因为pow在前面字符串的第35位置

split用法:str.split("分隔字符")

返回由str中由用户所定分隔字符的各字符串,字符串间由,号隔开

例如: "10 / 3 / / 4 / 7 / 9".split    ("/"),返回的是10, 3,空格, 4, 7, 9,认真看一下会发现数字与逗号间也有空格

文章中有这句话:Using split() with a regular expression argument (rather than a string argument) allows you the flexibility of ignoring multiple whitespace or delimiter characters.

我这里明显用的是普通字符串参数,下面用的是正则式参数

"10 / 3 / / 4 / 7 / 9".split(/[ \/]+/);

返回的是:10,3,4,7,9,注意这个串与上面串在空格的不同,数字与逗号间没有空格,这就是所谓的忽略空格

replace用法:str.replace("匹配子串","替换匹配子串的串")

如果匹配子串在原串中找不到,将不进行替换,返回是原串,若能找到匹配子串,则返回替换后的串

例如:var s = "Hello. Regexps are fun.";s = s.replace(".", "!");

叹号将代替第一个点号然后返回串,这是此函数特点,只替换第一处匹配的地方,如果要替换每处匹配的地方,需要用到正则式,正则式的作用很大,但是我只会皮毛,在此不举例。

match用法:str.match("匹配子串")

若没有匹配子串,则返回空,若存在匹配子串,则返回子串

posted @ 2008-08-31 21:03 Qzi 阅读(282) | 评论 (0)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页