一, servlet的能力
1, 获取浏览器提交的表单数据
2, 获取浏览器的附加信息
3, 处理数据
4, 给客户端产生一个相应
5, 在相应中添加附加信息
一, 获取浏览器提交的表单数据
String value = request.getParameter(String key);
String[] arr = request.getParameterValues(String key);
在获取表单数据时,如果表单数据中含有中文,此时会产生乱码。
乱码解决方式:
1, 通用方式:
Stringvalue = request.getParameter("username");
value = new String(value.getBytes("iso-8859-1"),"utf-8");
System.out.println(value);
2, 解决post提交时所产生的乱码问题
//注意不能解决get提交表单时的中文乱码问题
request.setCharacterEncoding("utf-8");
Stringvalue = request.getParameter("username");
3.解决get提交表单时的乱码问题
需要修改tomcat的配置文件(server.xml)--à<Connector>添加URIEncoding="utf-8"
<Connectorport="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"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-fileupload。欠你们的。
四, 获取浏览器的附加信息
什么是浏览器的附加信息?
所谓的浏览器附加信息其实就是浏览的基本信息。比如:浏览器的品牌,浏览器支持的语言,浏览器支持的文件格式等。
获取方式:
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();来改变相应类型
请留意MIME.doc
相应图片
//将需要给客户端相应的图片读进来 InputStream is = new FileInputStream(new File("f:/2.jpg")); byte[] buff = newbyte[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-dispositation”,”attachment;filename=\”aa.jgp\””);
3. 在下载时解决文件名是中文时的乱码问题
String filename = newString(filename.getBytes(“utf-8”),”iso-8859-1”);
//将需要给客户端相应的图片读进来 File file = new File("f:/鲁东大学.jpg"); InputStream is = new FileInputStream(file); byte[] buff = newbyte[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();//字节输出流。而getWriter返回的字符输出流 os.write(buff); os.flush(); is.close(); os.close(); |
七,关于servlet的线程安全问题
Servlet是一个线程不安全的技术。我们在servlet中定义成员变量时,需要额外注意,如果非要定义成员变量,那么以读取为主。千万不要又读又写。如果真的有这样的需求。加锁拉解决数据安全性的问题。
SingleThreadModel:servlet中提供的一个标识接口,该接口标识实现了该接口的servlet的运行方式会由并行化改为串行化执行。效率及其低下。所以该接口解决线程安全的方式已经过时,不推荐使用了。
Servlet在解决线程安全上更推荐我们使用锁来解决。