Servlet学习第三天

来源:互联网 发布:韩智慧知乎 编辑:程序博客网 时间:2024/06/03 07:53

一、Servlet可以用来干什么?

1、获取浏览器提交的表单数据
2、获取浏览器的附加信息
3、处理数据
4、给客户端产生一个响应
5、在响应中添加附加信息

二、获取浏览器提交的表单数据

String value=request.getParameter(String key);String[] arr=request.getParameterValues(String key);String value=request.getQueryString();Map<String,String[]> map = request.getParameterMap();  Enumeration<String> key = request.getParameterNames();  

在获取表单数据时,如果表单数据中含有中文,此时会产生乱码,乱码解决的三种方式:
1、通用方式

String value=request.getParameter("username");value=new String(value.getBytes("iso-8859-1"));

2、解决post提交时所产生的乱码问题

request.setCharacterEncoding("utf-8");String value=request.getParameter("username");

3、解决get提交表单的乱码问题
需要修改tomcat的配置文件(server.xml)—>(Connector)添加URIEncoding=”utf-8”

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8843" URIEncoding="utf-8">

三、文件上传

1、在做文件上传时,需要注意的时,表单的提交方式必须是post的,因为我们需要让表单以字节方式提交,而get只能是字符提交,很显然不适用
2、需要在form表单中修改请求的头信息,将原来的默认的字符提交修改为字节提交。
修改方式为:在form标签中添加一个属性和值:enctype=”multipart/form-data”
enctype=”multipart/form-data”:该属性表示当前表单为字节格式。服务器接收到该数据包后,发现请求的头部是multipart/form-data时就不会去解析当前的http数据包了,所以我们也无法使用request.getParameter()去获取表单数据了。
3、在servlet中,如果需要处理表单中的内容。我们需要通过request对象获取通信流,通过对流的对象操作完成相应的表单处理,但是比较麻烦,后期我们会使用apache的专门用于处理文件上传的组件:common-fileuoload。

四、获取浏览器附加信息

所谓的浏览器附加信息其实就是浏览的基本信息,比如:浏览器的品牌,浏览器支持的语言,浏览器支持的文件格式等。
获取方式:

String value=request.getHeader(key);

通过浏览器的附加信息 的key获取value

Enumeration<String> enu=request.getHeaderNames();

该方法表示获取附加信息的所有的key返回一个枚举。

Enumeration<String> enu=request.getHeaderNames();while(enu.hasMoreElements()){    String key=enu.nextElement();    out.println("<tr><td>"+key+"</td><td>"+request.getHeader(key)+"</td><tr/>");}

五、给客户端产生一个响应

1、为响应设置编码

response.setContentType("text/html;charset=utf-8");text/html://表示告知浏览器当前返回的响应内容的类型是什么charset=utf-8:表示告知浏览器用什么编码方式在页面中查看

2、设置response.setContentType();来改变响应的类型

InputStream is=new FileInputStream(new File("G://1.png"));byte[] buff=new byte[is.available()];is.read(buff);response.setContentType("image/jpeg");//在响应之前必须要设置响应的类型OutputStream os=response.getOutputStream);//字节输出流,而getWriter()是字符输出流os.write(buff);//把读进来的图片响应给客户端os.flush();is.close();os.close();

六、文件下载

在servlet中实现文件下载需要注意的地方有两点。
1、响应类型需要做修改,response.setContentType(“bin”);
2、在响应中添加附加信息

response.addHeader("Content-disposition","attachment;filename=\"aa.jpg\"");

3、在下载时解决文件名是中文时的乱码问题

File file=new File("G://图片.png");InputStream is=new FileInputStream(file);byte[] buff=new byte[is.available];is.read(buff);String fileName=new String(file.getName().getBytes("utf-8"),"iso-8859-1");response.setContentType("bin");response.addHeader("Content-disposition","attachment;filename=\""+fileName+"\"");OutputStream os=response.getOutputStream();os.write(buff);os.flush();is.close();os.close();

七、关于servlet的线程安全的问题

servlet是一个线程不安全的技术,我们在serlvet定义成员变量时,需要额外注意,如果非要定义成员变量,那么以读取为主,千万不要即读又写,如果真要有这种需要的话,加锁解决数据安全性的问题,SingleThreadModel:servlet中提供的一个标识接口,该接口表示实现了该接口的servlet的运行方式会由并行化改为串行化执行。效率及其低下,所以该接口解决线程安全的方式已经过时,不推荐使用,servlet在解决多线程安全上更推荐我们使用锁来解决。

原创粉丝点击