关于javastringwriter的信息

java对整型变量的输入流输出流

被你说的有点晕,为什么非要将整型放入输出流? 将String放入输入输出流,再在外面进行类型转换多好啊! 这些底层的操作之类的基本都是用的字符串,很少用别的类型的啊…

关于javastringwriter的信息

java中处理中文输入,不需要用到的类是

Java把不同类型的输入、输出抽象为流stream,分为输入流和输出流,用统一的接口来表示

Java开发环境中提供了包java.io,其中包括一系列的类来实现输入/输出处理

InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先

public abstract class InputStream implements Closeable

public abstract class OutputStream implements Closeable, Flushable

具体子类: ByteArrayInputStream, FileInputStream, FilterInputStream, ObjectInputStream,

PipedInputStream, SequenceInputStream, StringBufferInputStream

InputStream

InputStream类是一个抽象类,方法包括:

int read()

int read(byte[])

int read(byte[],int,int)

void close()关闭流

int available()报告流中直接可读的字节数

skip(long)跳过流中指定的字节

OutputStream

OutputStream也是一个抽象类。它的主要方法包括:

void write(int)

void write(byte[])

void write(byte[],int,int)

其中第一个方法的int型的参数对应要写入的字节,后两个方法的参数与InputStream类似。

void close() 关闭输出流

void flush() 强行将写入缓冲区中剩余的数据写入

File file = new File(“d:\\FileTest.java”);

if (file.exists()) {

try (InputStream is = new FileInputStream(file);) {

byte[] buffer = new byte[8192];

int len = is.read(buffer);

while (len 0) {

System.out.write(buffer, 0, len);

len = is.read(buffer);

}

} catch (Exception e) {

e.printStackTrace();

}

}

InputSream 和 OutputStream 中定义了 read() 和 write() 方法,它们被派生流类重载。字节流是字节序

列,它与外部设备中的字节存在着一一对应的关系,不存在字符的转换,被读写字节的个数与外部设备中的字节个数是相同的

基本输入输出方法

System类是Java语言中一个功能强大、非常有用的类,它提供了标准输入/输出及运行时的系统信息

System类不能创建对象,也就是说,System类的所有属性和方法都是静态的,引用时要以System 作为前缀

System.in与System.out是System类的两个静态属性,分别对应了系统的标准输入/输出流 System类管理标准输入输出流和错误流

System.out:把输出送到缺省的显示(通常是显示器),是PrintStream的对象

System.in:从标准输入获取输入(通常是键盘),是InputStream的对象

System.err:把错误信息送到缺省的显示,是PrintStream的对象

同时使用System.out和System.err输出信息不能保证显示顺序就是执行顺序,为了避免这种情况在测试代码执行中经常使用System.err输出

FileInputStream、FileOutputStream 顺序读取文件

PipedInputStream、PipedOutputStream 管道

ByteArrayInputStream、ByteArrayOutputStream 内存读写

FilterInputStream、FilterOutputStream 过滤流(有多线程同步)

DataInputStream、DataOutputStream 对数据类型读写,有多线程同步

BufferedInputStream、BufferedOutputStream 缓冲类型读写

1 、使用字节流进行文件的单字节复制

FileInputStream是InputStream的子类,FileInputStream属于节点流,用于按字节读取文件内容

FileOutputStream是OutputStream的子类,FileOutputStream属于节点流,用于按字节输出数据到文件中

//FileInputStream中read方法的定义

/**

从指定的输入流中按字节读取数据,如果读到流的末尾则返回-1,否则返回读取到的数据。如果文件不存

在则异常FileNotFoundException【IOException的子类】

*/

public int read() throws IOException {

return read0();

}

//FileOutputStream中write方法的定义

//属性,用于表示是否进行文件的追加操作而不是覆盖操作

private final boolean append;

//构造器方法的定义,其中name是文件名称,默认采用覆盖操作

public FileOutputStream(String name) throws FileNotFoundException {

this(name != null ? new File(name) : null, false);

}

//按照字节执行写出int数据,自动会去除多余的字节。如果文件不存在则自动创建新文件,如果

文件已经存在则按照append的值决定采用的是追加操作还是覆盖操作

public void write(int b) throws IOException {

write(b, append);

}

private native void write(int b, boolean append) throws IOException; //

由VM采用对等类的方式提供实现

public class Test1 {

public static void main(String[] args) throws IOException {

try (InputStream is = new FileInputStream(“c:/面向对象文档.txt”);

OutputStream os = new FileOutputStream(“test.txt”);) {

int kk;

while ((kk = is.read()) != -1) {

os.write(kk);

}

}

}

}

2 、读取 A.java 文件并在控制台上显示

如何使用控制台输出 : System.out 字节流

分析:使用字节流从 A.java 中一个字节一个字节的读取内容,然后再使用 System.out.print 方法输出即可

注意:读取操作返回的 int 的取值范围为 0-255 ,则表示这里不会有符号位,所以 is.read()==-1 不是只适合于文本文件

File ff = new File(“T1.java”);

if (ff.exists()) {// 如果文件存在则进行拷贝操作,否则提示文件不存在

InputStream is = new FileInputStream(ff);

OutputStream os = new FileOutputStream(“t1.bak”);

while (true) {

int kk = is.read();// 返回值应该是0-255,如果返回-1表示流已经结束

if (kk 0)break;

os.write(kk);

}

is.close();

os.close();

} else

System.out.println(“T1.java文件不存在”);

InputStream基本输入类

InputStream类是基本的输入类。它定义了所有输入流所需的方法。

public abstract int read() throws IOException读取一个字节并以整数的形式返回,0-255。如果 返回-1已到输入流的末尾。

public int read(byte b[]) throws IOException读取一系列字节并存储到一个数组,返回实际读取的 字节数。如果已经读到输入流的末尾则返回-1

public void close() throws IOException 关闭输入流并释放资源

public int read(byte b[],int offset,int length) throws IOException功能为从输入流中读数据。这一 方法有几种重载形式,可以读一个字节或一组字节。当遇到文件尾时,返回-1。最后一种形式中的 offset是指把结果放在b[]中从第offset个字节开始的空间,length为长度

public long skip (long n) throws IOEnception 从输入流跳过几个字节。返回值为实际跳过的字节数

OutputStream基本输出类

三个重载形式都是用来向输出流写数据的

public abstract void write(int b)向输入流写入一个字节数据,该字节为参数的低8位。

public void write(byte b[],int offset,int length)将一个字节类型的数组中的从指定位置offset开始 的length个字节写入到输出流

public void close( ) 关闭输出流,释放资源

public void write(byte b[])将一个字节类型的数组中的数据写入到输出流

public void flush() 清除缓冲区,将缓冲区内尚未写出的数据全部输出

字符流

在顶层有 Reader 和 Writer 两个抽象类。 Reader 和 Writer 中定义了 read() 和 write() 方法,它们被派生流类重载

Reader 抽象类的定义

public abstract class Reader implements Readable, Closeable {

//BIO,读取一个有效的字符,返回值为0到65535的整数,如果到达流的末尾则返回-1

public int read() throws IOException

//BIO,读取字符存储到char数组中,返回读取的字符个数,流结束则返回-1

public int read(char cbuf[]) throws IOException

//关闭流,同时释放资源

abstract public void close() throws IOException;

Writer 抽象类的定义

public abstract class Writer implements Appendable, Closeable, Flushable {

//写出一个字符到字符流,要写的字符包含在给定整数值的16个低位;16个高位被忽略。

public void write(int c) throws IOException

//将字符数组中的指定部分内容压入到字符流,从off开始共len个字符

abstract public void write(char cbuf[], int off, int len) throws

IOException;

/关闭流,同时释放资源

abstract public void close() throws IOException;

相关的子类

InputStreamReader、OutputStreamWriter桥接流,用于自动实现字节流和字符流的转换

FileReader、FileWriter文件流,用于实现针对文本文件的读写操作

CharArrayReader、CharArrayWriter内存流,用于实现针对char数组的读写操作

PipedReader、PipedWriter管道流,用于线程之间的通讯

FilterReader、FilterWriter过滤流的父类

BufferedReader、BufferedWriter缓存流,用于在流中添加缓冲区

StringReader、StringWriter内存流,用于实现针对字符串的读写操作

使用字符流实现 txt 文件的读取显示【其中包含中文】

编写一个程序,读取文件 test.txt 的内容并在控制台输出。如果源文件不存在,则显示相应的错误信息。

字符流 Reader

int read()读取一个字符并以整数的形式返回0-65535,如果返回-1则已到输入流末尾

int read(char[] cbuf)读取一系列字符并存储到一个数组中,返回实际读取的字符数,如果读到输入流末尾则返回-1

void close()关闭输入流并释放内存资源

int read(char[] cbuf, int off, int len) 读取len个字符并存储到一个数组中,从off位置开始,返回实

际读取的字符数,如果读取到输入流末尾则返回-1

long skip(long n)跳过n个字符不读,返回实际跳过的字节数

字符流 Writer

void write(int c) 将字符(int数组的低8位)压入到字符流中

void write(char[] cbuf, int off, int len)将字符数组中的指定部分内容压入到字符流中,从off开始共len个字符

void write(String str) 将字符串中的内容压入到字符流中

void close() 关闭流并释放所占用的资源

void write(String str, int off, int len) 将字符串中的指定部分内容压入到字符流中,从下标off开始共len个字符

void flush()刷新缓冲区,将缓冲区中的数据全部送出到目标地,然后清空缓冲区

void write(char[] cbuf) 将字符数组中的所有数据压入到字符流中

一般来说:一次读写一个字符效率太低,可以引入 char[] 数组提高执行效率

小结

在学些BIO时记忆父类的方法,区分子类的实现不同

InputStream中的方法 read(byte[]):int; Reader中方法read(char[]):int 如果到达流末尾 则-1

OutputStream中的方法 write(byte[],0,len):void;Writer中的方法 write(char[],0,len)/write(String)

一般在使用中,如果读取数据使用字节流,则写出数据采用的也是字节流;不建议混用,除非引入 桥接流

文件流

FileInputStream(“file-name”) FileInputStream(File) FileNotFoundException

FileReader(“file-name”) FileReader(File) FileNotFoundException

FileOutputStream(“file-name”) FileOutputStream(“file-name”,true) 默认文件覆盖,如果 参数true表示追加

FileWriter(“file-name”) FileWriter(“file-name”,true)

一般不使用单字节或者单字符的操作方法,使用数组

注意:try(){}是推荐写法,否则应该使用try{}finally{}结构保证流的关闭

针对二进制文件不建议使用字符流,建议使用字节流进行操作,否则有可能拷贝文件出现问题:

如果针对文本文件则建议使用字符流,因为编码使用比较方便

文章知识点与官方知识档案匹配

Java技能树类和接口类和面向对象

89124 人正在系统学习中

点击阅读全文

打开CSDN,阅读体验更佳

java用于输入输出流的类_java输入输出流_lsgn的博客

java输入输出流 java IO综述 在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable。 Java I/O主要包括如下几个层次,包含三个部分: …

java常见输入输出类型_3分钟秒懂大数据的博客

输入:每行输入一个数,连续输入n行,遇到0结束输入,然后输出结果。 importjava.util.ArrayList; importjava.util.Scanner; publicclassTest4{ publicstaticvoidmain(String[] args){ Scannersc=newScanner(System.in); …

25、JAVA进阶——输入输出流

一、认识Java的流 二、使用字节流读写文本文件 1、使用字节流类FileInputStream读文本文件 2、使用字节流类FileOutputStream写文本文件 三、使用字符流读写文本文件 1、使用字符流类BufferedReader和FileReader读文本文件 2、使用字符流类BufferedWrite和FileWrite写文本文件 四、读写二进制文件 1、 使用字节流读二进制文件 2、 使用字节流写二进制文件 五、序列化和反序列化 1、认识序列化 2、序列化保存对

继续访问

java 输入类_java 输入输出类

java中输入输出类如果理不清思路的话就会很混乱!一.File类提供与操作系统无关的文件操作!可以查看api文档了解它的方法二.输出操作:1.把信息输出到屏幕上最简单的操作就是使用标准输出:System.out.println();下面讨论一下流方式的输出,与之相关的类如下OutputStreamWriter:它提供字符流到字节流的转换,换句话说它写入字符数据然后按照指定字符集转换为字节数据Buf…

继续访问

JAVA的输入输出_努力的地球人的博客_java输出

Java的输入 Scanner类 为了使用scanner类,我们首先需要导入java.util.Scanner包 import java.util.Scanner; 1 创建scanner对象,从用户获取输入 //创建scanner对象 Scanner str=new Scanner(System.in); //接受用户输入 int w=str.nextIn…

java输入输出_java中输入输出总结_weixin_39609407的博客

标准输入studin,对象是键盘。 标准输出stdout,对象是屏幕。 标准错误输出stderr,对象也是屏幕。 二、java.io包中的数据流和文件类 字节流:从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。

Java——不同数据类型的输入输出方式与转化方式

java 中不同数据类型的 输入方法 输出格式 与 转化方式

继续访问

Java文本输出常用类

package com.ss.extract; import java.io.*; import org.apache.log4j.Logger; /** * 结果输出类 * @author Shu */ public class ResultOutput { private …

继续访问

1.Java基础入门 -(2)输入输出类_菜鸟的小虫子的博客

一. Java Scanner 类 java.util.Scanner是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。 Scanner 对象的基本语法: Scanner in= new Scanner(System.in); 示例1: 输入结果: …

java的输入输出流类型_理解JAVA输入输出流_天接云涛的博客

1、字节流抽象类 InputStream输入流 OutputStream输出流 2、字符流抽象类 Reader 输入字符流 Writer 输出字符流 四、JAVA中流体系架构 有一些对流进行操作的基本的方法,我们以文件输入输出流进行说明: …

java的输出类

System.out这个类是PrintStream类,定义如下 public class PrintStream extends FilterOutputStream PrintStream都是用print的相关函数输出到控制台上。print的实现都是用write(String s)实现。 而,PrintWriter这个输出类,也同样实现输出:PrintWriter extends …

继续访问

Java中的各种输出形式

一、Java中的各种输出形式: package cn.jl.lwj; public class Demo00 { public static void main(String[] args) { //标识符定义 区分大小写 int a = 5; int A = 6; //区分大小写 int Class = 6; int age = 5; //定义常量 final int AGE_MAX = 30;…

继续访问

java中的BIO基础-3

java中的io基础

继续访问

Java学习-IO流进阶

缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。

继续访问

IO进阶之高级IO

高级IO

继续访问

Java中的IO进阶操作

Java中的IO进阶操作 一、序列化和反序列化 常用于多台服务器之间进行java对象的数据传递。 1.概念 序列化 是指程序中准备好的Java对象,永久的保存在磁盘中,这个过程其实是一个out的动作。 ObjectOutputStream:通过在流中使用文件可以实现对象的持久存储。 创建对象:ObjectOutputStream(OutputStream out) 常用方法: void writeObject(Object obj):将指定的对象写入ObjectOutputStream 反序列化 是指把

继续访问

Java IO最详解,欢迎提出意见

Java IO 详解 初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂。而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见。 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会…

继续访问

java输出类型_java中各种类型的输入输出

import java.lang.Exception;import java.lang.String;import java.util.Scanner;public class test {public static void main(String[] args) {Scanner s = new Scanner(System.in);char ch;System.out.print(“Char…

继续访问

java中输入流的类_Java中的输入/输出流类

Java中包含的输入/输出流类 1.java.io包中的接口 (1)处理字节流的有DataInput接口和DataOutput接口,RandomAccessFile同时实现了这两个接口; (2)处理对象流的有ObjectInput接口和ObjectOutput接口,ObjectInputStream类实现了ObjectInput接口,ObjectOutputStream类实现了ObjectOutp…

继续访问

使用java的输入/输出类

1. 什么是IO? I:input 输入 通常做读取操作(将不同数据源的数据读入到内存中,也叫读取流) O:output 输出通常做写入操作(将内存中的数据写入到不同的数据源,也叫写入流) 2. 理解流的概念。 想像一下自来水公司要把水输到用户家里,应该先把自来水公司到用户家里的连接水管建好,再将水输出去。管道里输送的是水,但IO里输送的是字节。 u流是…

继续访问

Java中的输入/输出流类

Java中包含的输入/输出流类 1.java.io包中的接口 (1)处理字节流的有DataInput接口和DataOutput接口,RandomAccessFile同时实现了这两个接口; (2)处理对象流的有ObjectInput接口和ObjectOutput接口,ObjectInputStream类实现了ObjectInput接口,ObjectOutputStream类实现了ObjectOutp…

继续访问

最新发布 【Java基础】自定义一个格式输出类

在项目实际开发中,后端接口都按照一定的格式输出给前端调用,在返回中包括状态码和接口的主要作用等注释,再包含实际的data。

继续访问

IO流(进阶提高)

本篇文章继上一篇IO流(小试牛刀)继续更新JavaIO流的知识。 常见IO流的结构图解: 回顾一下IO的基本接口知识: ————————————————————我是不起眼的分割线———————————————————————— IO的序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程;Java反序列化是指把字节序列恢复为Java对象的过…

继续访问

java进阶8——IO流

File类 File概述 File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。 File类的构造函数 File(String pathname); // 将一个字符串路径封装成File对象 File(String parent,String child);…

继续访问

Java IO流进阶之常用流(一)

请多参考JDK文档:或 转换流——OutputStreamWriter类和InputStreamReader类 字节与字符的转换流: OutputStreamWriter:是Writer类的子类,将输出的字符流变为字节流。 InputStreamRe…

继续访问

详解JAVA I/O之二——java.io层次结构

br /java I/O(Input/Output)学习——java.io层次结构文章分类:Java编程stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型: br /(1)字节流 br /br / 表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,

java发送手机短信

package com.winhands.quartz;

import java.io.PrintWriter;

import java.io.StringWriter;

import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.winhands.base.service.BaseService;

import com.winhands.util.BaseConstant;

import com.winhands.web.dict.entity.DictCommon;

import com.winhands.web.xfhf.entity.SmsOutBox;

import com.winhands.web.xfhf.entity.SmsVisit;

import com.winhands.web.xfhf.entity.TaskInfo;

public class SmsSendSync {

public BaseService baseService;

public BaseService baseServiceMas;

public static final Logger logger = LoggerFactory.getLogger(SmsSendSync.class);

//同步短信到mas机待发短信表

public void work() {

// 任务ID 100001

// 首先查询任务是否正在执行

// 查询列表

TaskInfo taskInfo = new TaskInfo();

taskInfo.setTask_id(“100001”);

try {

taskInfo = (TaskInfo) baseService.queryForObject(“sms_send.queryTaskStatus”, taskInfo);

//如果状态是处室状态则执行,否则此次任务不执行

if (BaseConstant.task_status_cs.equals(taskInfo.getTask_status())) {

taskInfo.setTask_status(BaseConstant.task_status_zx);//设置任务执行状态为执行

taskInfo.setTask_last_start_time(new Date());//设置任务执行开始时间

baseService.update(“sms_send.updateTaskStatus”, taskInfo);//

//移动号码库

HashMapString,String hashMap = new HashMapString,String();

//134 、135、136、137、138、139、150、151、152、158、159、182、183、184。157、187、188

hashMap.put(“134”, “134”);

hashMap.put(“135”, “135”);

hashMap.put(“136”, “136”);

hashMap.put(“137”, “137”);

hashMap.put(“138”, “138”);

hashMap.put(“139”, “139”);

hashMap.put(“150”, “150”);

hashMap.put(“151”, “151”);

hashMap.put(“152”, “152”);

hashMap.put(“157”, “157”);

hashMap.put(“158”, “158”);

hashMap.put(“159”, “159”);

hashMap.put(“182”, “182”);

hashMap.put(“183”, “183”);

hashMap.put(“184”, “184”);

hashMap.put(“187”, “187”);

hashMap.put(“188”, “188”);

SmsVisit smsSend = new SmsVisit();

smsSend.setSms_status(BaseConstant.sms_status_csh);

List list = baseService.queryForList(“sms_send.queryForSmsTask”, smsSend);

List smsMasList = new ArrayList();

List smsList = new ArrayList();

if (list == null||list.size()==0) return;// 如果列表为空,没有待办任务,则任务结束

for (int i = 0; i  list.size(); i++) {

smsSend = (SmsVisit) list.get(i);

//String msg = messagecontent(smsSend);

String msg = smsSend.getSpare_2();

if(hashMap.get(smsSend.getVisit_phone().substring(0, 3))!=null){

                    SmsOutBox smsOutBox = new SmsOutBox();

    smsOutBox.setSismsid(smsSend.getP_id());

    smsOutBox.setReqdeliveryreport(BaseConstant.NoReport);

    smsOutBox.setApplicationid(BaseConstant.APPLICATIONID);

    smsOutBox.setDestaddr(smsSend.getVisit_phone());

    smsOutBox.setMsgfmt(BaseConstant.MSGFMT);

    smsOutBox.setRequesttime(new Date());

    smsOutBox.setExtcode(smsSend.getExtccode());

    smsOutBox.setSendmethod(BaseConstant.NoMsg);// 正常短信

                    smsOutBox.setMessagecontent(msg);

                    smsMasList.add(smsOutBox);

}else{

boolean con = true;

String lastMsg = msg;

int xh =0;

while(con){

lastMsg = msg.substring(0,msg.length()  55 ? 55 : msg.length());

msg = msg.substring(msg.length()  55 ? 55 : msg.length(),msg.length());

if (msg.equals(“”)) {

con = false;

}

SmsOutBox smsOutBox = new SmsOutBox();

    smsOutBox.setSismsid(smsSend.getP_id()+(xh==0?””:xh));

    xh++;

    smsOutBox.setReqdeliveryreport(BaseConstant.NoReport);

    smsOutBox.setApplicationid(BaseConstant.APPLICATIONID);

    smsOutBox.setDestaddr(smsSend.getVisit_phone());

    smsOutBox.setMsgfmt(BaseConstant.MSGFMT);

    smsOutBox.setRequesttime(new Date());

    smsOutBox.setExtcode(smsSend.getExtccode());

    smsOutBox.setSendmethod(BaseConstant.NoMsg);// 正常短信

                    smsOutBox.setMessagecontent(lastMsg);

                        smsMasList.add(smsOutBox);

}

}

    SmsVisit smsSendTemp = new SmsVisit();

smsSendTemp.setP_id(smsSend.getP_id()); 

//smsSendTemp.setSpare_2(msg);//短信内容

smsSendTemp.setSms_status_time(new Date());

smsSendTemp.setSms_status(BaseConstant.sms_status_yfswg); 

    smsList.add(smsSendTemp);

}

baseService.insertBatch(“sms_send.insertSmsOutBox”, smsMasList);//插入本地历史记录表

baseServiceMas.insertBatch(“sms_mas.insertSmsOutBox”, smsMasList);//插入mas机待发送表

baseService.updateBatch(“sms_send.updateSmsVisit”, smsList);//更新回访记录状态

}

} catch (Exception e) {

e.printStackTrace();

//baseService.saveLog(“同步短信到mas机待发短信表”, “100001”, “同步短信到mas机待发短信表错误”);

logger.error(“同步短信到mas机待发短信表错误”, getTrace(e));

}finally{

try {

taskInfo.setTask_status(BaseConstant.task_status_cs);//设置任务执行状态为初始

taskInfo.setTask_last_end_time(new Date());//设置任务执行结束时间

taskInfo.setTask_status_desc(“任务执行结束”);

baseService.update(“sms_send.updateTaskStatus”, taskInfo);//

} catch (Exception e2) {

e2.printStackTrace();

// TODO: handle exception

}

}

}

public String messagecontent(SmsVisit smsSend){

//XX,您好!您于XX月XX日办理XX业务(或XX,您好!XX大队于XX月XX日对你单位进行监督检查/行政处罚/火灾调查),现进行满意度回访,请回复数字:1为满意;2为基本满意;3为不满意。感谢您对消防工作的支持!回复免费。宿迁市公安消防支队

//首先根据业务类型来判断采用哪种模板 监察

StringBuffer msg = new StringBuffer(“”); 

if(BaseConstant.jiancha.equals(smsSend.getVisit_deal_business_type())){

msg.append(smsSend.getVisit_name_cn())

   .append(“,您好!”)

   .append(smsSend.getVisit_deal_org_name())

   .append(“于”)

   .append(smsSend.getVisit_deal_time().substring(4, 6)).append(“月”)

   .append(smsSend.getVisit_deal_time().substring(6, 8)).append(“日”)

   .append(“对你单位进行”).append(DictCommon.getEntryMap(BaseConstant.jiancha).get(smsSend.getVisit_deal_business()))

   .append(“,现进行满意度回访,请回复数字:1为满意;2为基本满意;3为不满意。感谢您对消防工作的支持!”);

}else if(BaseConstant.yewu.equals(smsSend.getVisit_deal_business_type())){

msg.append(smsSend.getVisit_name_cn())

   .append(“,您好!您于”)

   .append(smsSend.getVisit_deal_time().substring(4, 6)).append(“月”)

   .append(smsSend.getVisit_deal_time().substring(6, 8)).append(“日”)

   .append(“办理”).append(smsSend.getVisit_deal_business()).append(“业务,”)

   .append(“现进行满意度回访,请回复数字:1为满意;2为基本满意;3为不满意。感谢您对消防工作的支持!”);

}

return msg.toString();

}

public BaseService getBaseService() {

return baseService;

}

public void setBaseService(BaseService baseService) {

this.baseService = baseService;

}

public BaseService getBaseServiceMas() {

return baseServiceMas;

}

public void setBaseServiceMas(BaseService baseServiceMas) {

this.baseServiceMas = baseServiceMas;

}

public static void main(String[] args){

List smsMasList = new ArrayList(); 

try {

String msg = “***,您好!*********于2015年5月2日对你单位进行监督检查,现进行满意度回访,请回复数字:1为满意;2为基本满意;3为不满意。感谢您对消防工作的支持!”;

SmsOutBox smsOutBox = new SmsOutBox();

smsOutBox.setSismsid(“12344”);

smsOutBox.setReqdeliveryreport(BaseConstant.NoReport);

smsOutBox.setApplicationid(BaseConstant.APPLICATIONID);

smsOutBox.setDestaddr(“111”);

smsOutBox.setMsgfmt(BaseConstant.MSGFMT);

smsOutBox.setRequesttime(new Date());

smsOutBox.setExtcode(“2222”);

smsOutBox.setSendmethod(BaseConstant.NoMsg);// 正常短信

boolean con = true;

String lastMsg = msg;

while(con){

lastMsg = msg.substring(0,msg.length()  55 ? 55 : msg.length());

msg = msg.substring(msg.length()  55 ? 55 : msg.length(),msg.length());

if (msg.equals(“”)) {

con = false;

}

SmsOutBox smOutBox_temp = new SmsOutBox(); 

smOutBox_temp = smsOutBox;

smOutBox_temp.setMessagecontent(lastMsg);

 

smsMasList.add(smOutBox_temp);

}

    for(Object o:smsMasList){

    SmsOutBox smsOutBox2 = (SmsOutBox)o;

    System.out.println(smsOutBox2.getMessagecontent());

    }

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static String getTrace(Throwable t) {

        StringWriter stringWriter= new StringWriter();

        PrintWriter writer= new PrintWriter(stringWriter);

        t.printStackTrace(writer);

        StringBuffer buffer= stringWriter.getBuffer();

        return buffer.toString();

    }

}

短信不是你想发  想发就能发,是收费的,我们公司是租用的移动MAS平台的短信发送接收平台,上面那是和一个和mas同步的一个小程序,租用别人的mas平台是收费的,平台有很多自己选择,有发送接口可以调,发送内容自己提供

JAVA IO 输入输出

StringWriter 类

实现一个用于将信息写入字符串的 TextWriter。该信息存储在基础 StringBuilder 中。

命名空间: System.IO

程序集: mscorlib(在 mscorlib.dll 中)

Visual Basic(声明)

SerializableAttribute _

ComVisibleAttribute(True) _

Public Class StringWriter _

Inherits TextWriterVisual Basic (用法)

Dim instance As StringWriterC#

[SerializableAttribute]

[ComVisibleAttribute(true)]

public class StringWriter : TextWriterVisual C++

[SerializableAttribute]

[ComVisibleAttribute(true)]

public ref class StringWriter : public TextWriterJ#

/** @attribute SerializableAttribute */

/** @attribute ComVisibleAttribute(true) */

public class StringWriter extends TextWriterJScript

public class StringWriter extends TextWriter

Visual Basic Copy Code

Option Explicit

Option Strict

Imports Microsoft.VisualBasic

Imports System

Imports System.IO

Public Class StrReader

Shared Sub Main()

Dim textReaderText As String = “TextReader is the ” _

“abstract base class of StreamReader and ” _

“StringReader, which read characters from streams ” _

“and strings, respectively.” _

vbCrLf vbCrLf _

“Create an instance of TextReader to open a text ” _

“file for reading a specified range of characters, ” _

“or to create a reader based on an existing stream.” _

vbCrLf vbCrLf _

“You can also use an instance of TextReader to read ” _

“text from a custom backing store using the same ” _

“APIs you would use for a string or a stream.” _

vbCrLf vbCrLf

Console.WriteLine(“Original text:” vbCrLf vbCrLf _

textReaderText)

‘ From textReaderText, create a continuous paragraph

‘ with two spaces between each sentence.

Dim aLine, aParagraph As String

Dim strReader As New StringReader(textReaderText)

While True

aLine = strReader.ReadLine()

If aLine Is Nothing Then

aParagraph = aParagraph vbCrLf

Exit While

Else

aParagraph = aParagraph aLine ” “

End If

End While

Console.WriteLine(“Modified text:” vbCrLf vbCrLf _

aParagraph)

‘ Re-create textReaderText from aParagraph.

Dim intCharacter As Integer

Dim convertedCharacter As Char

Dim strWriter As New StringWriter()

strReader = New StringReader(aParagraph)

While True

intCharacter = strReader.Read()

‘ Check for the end of the string

‘ before converting to a character.

If intCharacter = -1 Then

Exit While

End If

convertedCharacter = Convert.ToChar(intCharacter)

If convertedCharacter = “.”C Then

strWriter.Write(“.” vbCrLf vbCrLf)

‘ Bypass the spaces between sentences.

strReader.Read()

strReader.Read()

Else

strWriter.Write(convertedCharacter)

End If

End While

Console.WriteLine(vbCrLf “Original text:” vbCrLf _

vbCrLf strWriter.ToString())

End Sub

End Class

C# Copy Code

using System;

using System.IO;

class StringRW

{

static void Main()

{

string textReaderText = “TextReader is the abstract base ” +

“class of StreamReader and StringReader, which read ” +

“characters from streams and strings, respectively.\n\n” +

“Create an instance of TextReader to open a text file ” +

“for reading a specified range of characters, or to ” +

“create a reader based on an existing stream.\n\n” +

“You can also use an instance of TextReader to read ” +

“text from a custom backing store using the same ” +

“APIs you would use for a string or a stream.\n\n”;

Console.WriteLine(“Original text:\n\n{0}”, textReaderText);

// From textReaderText, create a continuous paragraph

// with two spaces between each sentence.

string aLine, aParagraph = null;

StringReader strReader = new StringReader(textReaderText);

while(true)

{

aLine = strReader.ReadLine();

if(aLine != null)

{

aParagraph = aParagraph + aLine + ” “;

}

else

{

aParagraph = aParagraph + “\n”;

break;

}

}

Console.WriteLine(“Modified text:\n\n{0}”, aParagraph);

// Re-create textReaderText from aParagraph.

int intCharacter;

char convertedCharacter;

StringWriter strWriter = new StringWriter();

strReader = new StringReader(aParagraph);

while(true)

{

intCharacter = strReader.Read();

// Check for the end of the string

// before converting to a character.

if(intCharacter == -1) break;

convertedCharacter = Convert.ToChar(intCharacter);

if(convertedCharacter == ‘.’)

{

strWriter.Write(“.\n\n”);

// Bypass the spaces between sentences.

strReader.Read();

strReader.Read();

}

else

{

strWriter.Write(convertedCharacter);

}

}

Console.WriteLine(“\nOriginal text:\n\n{0}”,

strWriter.ToString());

}

}

Visual C++ Copy Code

using namespace System;

using namespace System::IO;

int main()

{

String^ textReaderText = “TextReader is the abstract base “

“class of StreamReader and StringReader, which read “

“characters from streams and strings, respectively.\n\n”

“Create an instance of TextReader to open a text file “

“for reading a specified range of characters, or to “

“create a reader based on an existing stream.\n\n”

“You can also use an instance of TextReader to read “

“text from a custom backing store using the same “

“APIs you would use for a string or a stream.\n\n”;

Console::WriteLine( “Original text:\n\n{0}”, textReaderText );

// From textReaderText, create a continuous paragraph

// with two spaces between each sentence.

String^ aLine;

String^ aParagraph;

StringReader^ strReader = gcnew StringReader( textReaderText );

while ( true )

{

aLine = strReader-ReadLine();

if ( aLine != nullptr )

{

aParagraph = String::Concat( aParagraph, aLine, ” ” );

}

else

{

aParagraph = String::Concat( aParagraph, “\n” );

break;

}

}

Console::WriteLine( “Modified text:\n\n{0}”, aParagraph );

// Re-create textReaderText from aParagraph.

int intCharacter;

Char convertedCharacter;

StringWriter^ strWriter = gcnew StringWriter;

strReader = gcnew StringReader( aParagraph );

while ( true )

{

intCharacter = strReader-Read();

// Check for the end of the string

// before converting to a character.

if ( intCharacter == -1 )

break;

convertedCharacter = Convert::ToChar( intCharacter );

if ( convertedCharacter == ‘.’ )

{

strWriter-Write( “.\n\n” );

// Bypass the spaces between sentences.

strReader-Read();

strReader-Read();

}

else

{

strWriter-Write( convertedCharacter );

}

}

Console::WriteLine( “\nOriginal text:\n\n{0}”, strWriter-ToString() );

}

J# Copy Code

import System.*;

import System.IO.*;

class StringRW

{

public static void main(String[] args)

{

String textReaderText = “TextReader is the abstract base ”

+ “class of StreamReader and StringReader, which read ”

+ “characters from streams and strings, respectively.\n\n”

+ “Create an instance of TextReader to open a text file ”

+ “for reading a specified range of characters, or to ”

+ “create a reader based on an existing stream.\n\n”

+ “You can also use an instance of TextReader to read ”

+ “text from a custom backing store using the same ”

+ “APIs you would use for a string or a stream.\n\n”;

Console.WriteLine(“Original text:\n\n{0}”, textReaderText);

// From textReaderText, create a continuous paragraph

// with two spaces between each sentence.

String aParagraph = “”;

String aLine;

StringReader strReader = new StringReader(textReaderText);

while (true) {

aLine = strReader.ReadLine();

if (aLine != null) {

aParagraph = aParagraph + aLine + ” “;

}

else {

aParagraph = aParagraph + “\n”;

break ;

}

}

Console.WriteLine(“Modified text:\n\n{0}”, aParagraph);

// Re-create textReaderText from aParagraph.

int intCharacter;

char convertedCharacter;

StringWriter strWriter = new StringWriter();

strReader = new StringReader(aParagraph);

while (true) {

intCharacter = strReader.Read();

// Check for the end of the string

// before converting to a character.

if (intCharacter == -1) {

break ;

}

convertedCharacter = Convert.ToChar(intCharacter);

if (convertedCharacter == ‘.’) {

strWriter.Write(“.\n\n”);

// Bypass the spaces between sentences.

strReader.Read();

strReader.Read();

}

else {

strWriter.Write(convertedCharacter);

}

}

Console.WriteLine(“\nOriginal text:\n\n{0}”, strWriter.ToString());

} //main

} //StringRW

java里的,这个有什么地方错了吗?为什么不能执行,才学的,不会了

import com.sun.xml.internal.txw2.Document;

这个是什么?

要使用这个

import org.w3c.dom.Document;

transformer.transform(………..);

要修改成:

transformer.newTransformer().transform(………);

什么是java过滤器! 它的功能和作用是什么啊?

Servlet API 很久以前就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充。在 J2EE 探索者 系列文章的最后一篇中,作者 Kyle Gabhart 将向您介绍 Servlet 过滤器体系结构,定义过滤器的许多应用,并指导您完成典型过滤器实现的三个步骤。他还会透露 bean 的一些激动人心的变化,预计刚发布的 Java Servlet 2.4 规范会引入这些变化。

Servlet 过滤器是可插入的 Web 组件,它允许我们实现 Web 应用程序中的预处理和后期处理逻辑。过滤器支持 servlet 和 JSP 页面的基本请求处理功能,比如日志记录、性能、安全、会话处理、XSLT 转换,等等。 过滤器最初是随 Java Servlet 2.3 规范发布的,最近定稿的 2.4 规范对它进行了重大升级。在这 J2EE 探索者 系列文章的最后一篇中,我将向您介绍 Servlet 过滤器的基础知识 —— 比如总体的体系结构设计、实现细节,以及在 J2EE Web 应用程序中的典型应用,还会涉及一些预计最新的 Servlet 规范将会提供的扩展功能。

Servlet 过滤器是什么?

Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性, 等等。过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中,这些组件通过一个配置文件来声明,并动态地处理。

Servlet 过滤器中结合了许多元素,从而使得过滤器成为独特、强大和模块化的 Web 组件。也就是说,Servlet 过滤器是:

声明式的:过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码或 JSP 页面。

动态的:过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。

灵活的:过滤器在 Web 处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处 理,以及处理在防火墙之后的 Web 组件之间调度的请求。最后,可以将过滤器链接起来以提供必需的功能。

模块化的:通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。

可移植的:与 Java 平台的其他许多方面一样,Servlet 过滤器是跨平台和跨容器可移植的,从而进一步支持了 Servler 过滤器的模块化和可重用本质。

可重用的:归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。

透明的:在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet 或 JSP 页面提供的核心处理。因而,过滤器可以根据需要添加或删除,而不会破坏 servlet 或 JSP 页面。

所以 Servlet 过滤器是通过一个配置文件来灵活声明的模块化可重用组件。过滤器动态地处理传入的请求和传出的响应,并且无需修改应用程序代码就可以透明地添加或删除它 们。最后,过滤器独立于任何平台或者 Servlet 容器,从而允许将它们容易地部署到任何相容的 J2EE 环境中。

在接下来的几小节中,我们将进一步考察 Servlet 过滤器机制的总体设计,以及实现、配置和部署过滤器所涉及的步骤。我们还将探讨 Servlet 过滤器的一些实际应用,最后简要考察一下模型-视图-控制器(MVC)体系结构中包含的 Servlet 过滤器,从而结束本文的讨论。

Servlet 过滤器体系结构

正如其名称所暗示的,Servlet 过滤器 用于拦截传入的请求和/或传出的响应,并监视、修改或以某种方式处理正在通过的数据流。过滤器是自包含、模块化的组件,可以将它们添加到请求/响应链中, 或者在无需影响应用程序中其他 Web 组件的情况下删除它们。过滤器仅只是改动请求和响应的运行时处理,因而不应该将它们直接嵌入 Web 应用程序框架,除非是通过 Servlet API 中良好定义的标准接口来实现。

Web 资源可以配置为没有过滤器与之关联(这是默认情况)、与单个过滤器关联(这是典型情况),甚至是与一个过滤器链相关联。那么过滤器究竟做什么呢? 像 servlet 一样,它接受请求并响应对象。然后过滤器会检查请求对象,并决定将该请求转发给链中的下一个组件,或者中止该请求并直接向客户机发回一个响应。如果请求被 转发了,它将被传递给链中的下一个资源(另一个过滤器、servlet 或 JSP 页面)。在这个请求设法通过过滤器链并被服务器处理之后,一个响应将以相反的顺序通过该链发送回去。这样就给每个过滤器都提供了根据需要处理响应对象的机 会。

当过滤器在 Servlet 2.3 规范中首次引入时,它们只能过滤 Web 客户机和客户机所访问的指定 Web 资源之间的内容。如果该资源然后将请求调度给其他 Web 资源,那就不能向幕后委托的任何请求应用过滤器。2.4 规范消除了这个限制。Servlet 过滤器现在可以应用于 J2EE Web 环境中存在请求和响应对象的任何地方。因此,Servlet 过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间。这才是我所称的强大能力和灵活性!

实现一个 Servlet 过滤器

他们说“好事多磨”。我不知道“他们”指的是谁,或者这句古老的谚语究竟有多真实,但是实现一个 Servlet 过滤器的确要经历三个步骤。首先要编写过滤器实现类的程序,然后要把该过滤器添加到 Web 应用程序中(通过在 Web 部署描述符 /web.xml 中声明它),最后要把过滤器与应用程序一起打包并部署它。我们将详细研究这其中的每个步骤。

1. 编写实现类的程序

过滤器 API 包含 3 个简单的接口(又是数字 3!),它们整洁地嵌套在 javax.servlet 包中。那 3 个接口分别是 Filter、FilterChain 和 FilterConfig。从编程的角度看,过滤器类将实现 Filter 接口,然后使用这个过滤器类中的 FilterChain 和 FilterConfig 接口。该过滤器类的一个引用将传递给 FilterChain 对象,以允许过滤器把控制权传递给链中的下一个资源。FilterConfig 对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。

为了与我们的三步模式保持一致,过滤器必须运用三个方法,以便完全实现 Filter 接口:

init():这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。

doFilter():与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet())来处理请求一样,过滤器拥有单个用于处理请求和响应的方法——doFilter()。这个方法接受三个输入参数:一个 ServletRequest、response 和一个 FilterChain 对象。

destroy():正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。展示了一个非常简单的过滤器,它跟踪满足一个客户机的 Web 请求所花的大致时间。

一个过滤器类实现

import javax.servlet.*;

import java.util.*;

import java.io.*;

public class TimeTrackFilter implements Filter {

private FilterConfig filterConfig = null;

public void init(FilterConfig filterConfig)

throws ServletException {

this.filterConfig = filterConfig;

}

public void destroy() {

this.filterConfig = null;

}

public void doFilter( ServletRequest request,

ServletResponse response, FilterChain chain )

throws IOException, ServletException {

Date startTime, endTime;

double totalTime;

startTime = new Date();

// Forward the request to the next resource in the chain

chain.doFilter(request, wrapper);

// — Process the response — \\

// Calculate the difference between the start time and end time

endTime = new Date();

totalTime = endTime.getTime() – startTime.getTime();

totalTime = totalTime / 1000; //Convert from milliseconds to seconds

StringWriter sw = new StringWriter();

PrintWriter writer = new PrintWriter(sw);

writer.println();

writer.println(“===============”);

writer.println(“Total elapsed time is: ” + totalTime + ” seconds.” );

writer.println(“===============”);

// Log the resulting string

writer.flush();

filterConfig.getServletContext().

log(sw.getBuffer().toString());

}

}

复制代码

这个过滤器的生命周期很简单,不管怎样,我们还是研究一下它吧:

初始化

当容器第一次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 FilterConfig 对象的引用。我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的。

过滤

过滤器的大多数时间都消耗在这里。doFilter() 方法被容器调用,同时传入分别指向这个请求/响应链中的 ServletRequest、ServletResponse 和 FilterChain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 FilterChain 对象引用上的 doFilter()方法),之后在处理控制权返回该过滤器时处理响应。

析构

容器紧跟在垃圾收集之前调用 destroy() 方法,以便能够执行任何必需的清理代码。

2. 配置 Servlet 过滤器

过滤器通过 web.xml 文件中的两个 XML 标签来声明。filter 标签定义过滤器的名称,并且声明实现类和 init() 参数。filter-mapping 标签将过滤器与 servlet 或 URL 模式相关联。

摘自一个 web.xml 文件,它展示了如何声明过滤器的包含关系:

在 web.xml 中声明一个过滤器

filter

filter-namePage Request Timer/filter-name

filter-classTimeTrackFilter/filter-class

/filter

filter-mapping

filter-namePage Request Timer/filter-name

servlet-nameMain Servlet/servlet-name

/filter-mapping

servlet

servlet-nameMain Servlet/servlet-name

servlet-classMainServlet/servlet-class

/servlet

servlet-mapping

servlet-nameMain Servlet/servlet-name

url-pattern/*/url-pattern

/servlet-mapping

复制代码

上 面的代码示例声明了一个过滤器(”Page Request Timer”),并把它映射到一个 servlet(”Main Servlet”)。然后为该 servlet 定义了一个映射,以便把每个请求(由通配符指定)都发送到该 servlet。这是控制器组件的典型映射声明。您应该注意这些声明的顺序,因为千万不能背离这些元素的顺序。

3. 部署 Servlet 过滤器

事实上,与 Web 应用程序一起部署过滤器绝对不涉及任何复杂性。只需把过滤器类和其他 Web 组件类包括在一起,并像您通常所做的那样把 web.xml 文件(连同过滤器定义和过滤器映射声明)放进 Web 应用程序结构中,servlet 容器将处理之后的其他所有事情。

过滤器的许多应用

您在 J2EE Web 应用程序中利用过滤器的能力,仅受到您自己的创造性和应用程序设计本领的限制。在适合使用装饰过滤器模式或者拦截器模式的任何地方,您都可以使用过滤器。过滤器的一些最普遍的应用如下:

加载:对于到达系统的所有请求,过滤器收集诸如浏览器类型、一天中的时间、转发 URL 等相关信息,并对它们进行日志记录。

性能:过滤器在内容通过线路传来并在到达 servlet 和 JSP 页面之前解压缩该内容,然后再取得响应内容,并在将响应内容发送到客户机机器之前将它转换为压缩格式。

安全:过滤器处理身份验证令牌的管理,并适当地限制安全资源的访问,提示用户进行身份验证和/或将他们指引到第三方进行身份验证。过滤器甚至能够管理访问 控制列表(Access Control List,ACL),以便除了身份验证之外还提供授权机制。将安全逻辑放在过滤器中,而不是放在 servlet 或者 JSP 页面中,这样提供了巨大的灵活性。在开发期间,过滤器可以关闭(在 web.xml 文件中注释掉)。在生产应用中,过滤器又可以再次启用。此外还可以添加多个过滤器,以便根据需要提高安全、加密和不可拒绝的服务的等级。

会话处理:将 servlet 和 JSP 页面与会话处理代码混杂在一起可能会带来相当大的麻烦。使用过滤器来管理会话可以让 Web 页面集中精力考虑内容显示和委托处理,而不必担心会话管理的细节。

XSLT 转换:不管是使用移动客户端还是使用基于 XML 的 Web 服务,无需把逻辑嵌入应用程序就在 XML 语法之间执行转换的能力都绝对是无价的。

使过滤器适应 MVC 体系结构

模型-视图-控制器(Model-View-Controller,MVC)体系结构是一个有效的设计,它现在已作为最重要的设计方法学,整合到了诸如 Jakarta Struts 和 Turbine 等大多数流行的 Web 应用框架中。过滤器旨在扩充 MVC 体系结构的请求/响应处理流。不管请求/响应发生在客户机和服务器之间,还是发生在服务器上的其他组件之间,过滤器在处理流中的应用都是相同的。从 MVC 的观点看,调度器组件(它或者包括在控制器组件中,或者配合控制器组件工作)把请求转发给适当的应用程序组件以进行处理。这使得控制器层成为包括 Servlet 过滤器的最佳位置。通过把过滤器放在控制器组件本身的前面,过滤器可以应用于所有请求,或者通过将它放在控制器/调度器与模型和控制器之间,它可以应用于 单独的 Web 组件。

MVC 体系结构广为传播,并具有良好的文档。请通过 参考资料 中的链接了解关于 MVC 和 MVC 体系结构中的 Servlet 实现的更多信息。

结束语

虽然过滤器才出现几年时间,但它们本身已作为一个关键组件嵌入到了所有敏捷的、面向对象的 J2EE Web 应用程序中。本文向您介绍了 Servlet 过滤器的使用。本文讨论了过滤器的高级设计,比较了当前规范(2.4)和以前(2.3)的模型,讲述了实现过滤器所涉及的精确步骤,以及如何在 Web 应用程序中声明过滤器,然后与应用程序一起部署它。本文还阐述了 Servlet 过滤器的一些最普遍应用,并提到了过滤器如何适应传统的 MVC 体系结构。

这是 J2EE 探索者 系列的最后一篇文章。我们在年初通过粗略研究 Enterprise JavaBean 组件来开始我们的旅程,并提到了何时使用这些组件才真正有意义,以及何时这些组件才会变得大材小用的问题。然后我们将目光转向了 Web 层,绘制了一条通过 Servlet、JSP 页面、JavaBean 技术以及 Java Servlet API 中的无数选择和功能的路径。在这个系列文章中与您一起艰苦跋涉真是一件快乐的事情。我享受着编写这个系列文章的乐趣,并且我从大家的反馈中知道,这对您也 是一个很有价值的过程。

Java 过滤器的作用

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月24日 06:35:51
下一篇 2024年3月24日 06:42:59

相关推荐

  • 关于avrstudio6c语言的信息

    c语言的程序员们你们公司用的开发工具是什么呢? 学c语言可以用的软件推荐如下:TurboC是由美国Borland公司开发的一套C语言程序开发工具,Borland公司是一家专门从事软件开发、研制的大公司。 Code:Blocks是一个开放源码的全功能的跨平台C/C++集成开发环境。Code:Blocks是开放源码软件。Code:Blocks由纯粹的C++语言开…

    2024年5月23日
    4700
  • 关于java如何查找线程的信息

    kill-3生成的线程堆栈怎么查看 通过给JVM发送一个SIGQUIT信号,您可以得到一个线程堆。 threaddump文件就是文本文件,可以使用任何文本查看工具进行查看; 建议使用比较高效的工具,比如more, less 等。 “Full thread dump”是一个全局唯一的关键字,你可以在中间件和单机版本Java的线程堆栈信息的输出日志中找到它(比如…

    2024年5月23日
    4100
  • 关于javasocketreader的信息

    用JAVA编写一个socket通信程序。 1、java编程对于Socket之间的通信过程如下:服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。 2、服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞。 此时,如果客户端有一个socket连接到服务端,那…

    2024年5月23日
    8000
  • 关于javapitfallspdf的信息

    怎么用java动态生成pdf文档 1、首先,您需要在 Java 程序中添加 Spire.Xls.jar 文件作为依赖项。您可以从这个链接下载 JAR 文件;如果您使用 Maven,则可以通过在 pom.xml 文件中添加以下代码导入 JAR 文件。 2、iText是着名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通…

    2024年5月23日
    4400
  • 关于pythonexcel打印设置字体的信息

    如何使用python更改excel表中的字体属性 字体,背景,边框等的颜色都可以通过三种方式设置:索引,aRGB或主题。 索引颜色是旧版实现,颜色本身取决于工作薄或应用程序默认提供的索引。主题颜色可用于互补色,但也取决于工作薄中存在的主题,因此,建议使用RGB颜色。 有着一定的参考价值,有需要的朋友可以参考一下可使用的第三方库python中处理excel表格…

    2024年5月23日
    4700
  • 关于linuxjpeg下载的信息

    请问怎么用grub2直接引导win10,本人Linux新手 第一步,当然是下载linux ubuntu1x的镜像了,这个小伙伴可以百度,去正规的网站现在,这里,我先提供一个站点:mirrors.xmu.edu.cn,厦门大学的信息与网络中心。里面有很多linux版本。有Deepin CenOS ubuntu什么什么的。 第一步:\x0d\x0a当然是下载Ub…

    2024年5月23日
    5400
  • 关于excel2013vc的信息

    如何利用VC++自动生成Excel表格 1、首先,我们需要点击文件菜单栏按钮。然后,我们点击生成EXE按钮。接下来,我们点击保存路径。然后,我们输入我们想要保存的文件名。最后,我们点击确定按钮。然后,我们便可以看到,在桌面生成了Excel表格了。 2、在主对话框中加入一个按钮 ID IDC_EXCELTEST Caption Test Excel 双击该按钮…

    2024年5月23日
    5400
  • 关于2t硬盘linux分区的信息

    linux硬盘2TB限制问题 1、Linux中进行磁盘分区一般是用fdisk这个命令,但是fdisk命令无法支持大于2TB以上的分区,而parted命令却是用于2TB以上大小的磁盘分区的工具。 2、asm无法识别2t磁盘是因为在分区的时候造成的,所以asm和linux都会有这个2T的限制。磁盘分区主要有MBR和GPT两种方式,发生2T限制的正是这个MBR方式…

    2024年5月23日
    8300
  • 关于linux下载geneontology的信息

    下载GO/KEGG某一pathway的genelist 功能(GO)或者通路(Pathway)富集分析时,都会涉及到 Background; 做分析时,分析工具会提供一些数据供使用者选择或者使用自定义的gene list。 clusterProfiler是一个功能强大的R包,同时支持GO和KEGG的富集分析,而且可视化功能非常的优秀,本章主要介绍利用这个R包…

    2024年5月23日
    5100
  • 关于linux下的mnt目录的信息

    Linux目录结构 总体而言,Linux系统的文件系统由块设备、分区、文件系统、目录结构、文件和元数据以及挂载点等组成。这种组织结构和层次关系提供了对文件和目录的有效管理和访问机制。 根目录和家目录均只是一种linux文件挂载点,linux采用树状发展目录结构根目录就是第一级,家目录与根目录看起来只是一个一级目录和二级目录的关系,实际上差别很大。 首先,打开…

    2024年5月23日
    5600

发表回复

登录后才能评论



关注微信