一、转发请求RequestDispatcher
使用request域对象把数据带给转发资源,与重定向的区别:客户端只发出一次请求,服务器端调用多个资源,客户端浏览器地址栏没改变;转发是一次请求,使用的是同一个response和request;
?
ServletContext.getRequestDispatcher(String); ServletContext.getNamedDispatcher(String); ServletRequest.getRequestDispatcher(String);
有两种方式:
resp.setContentType("text/html;charset=UTF-8"); resp.addHeader("refresh", "3;url=‘/W/index.html‘"); resp.getWriter().write("恭喜登录成功,如果没有中转,请点击超链接<a href=‘/W/index.html‘>AAAA</a>");
上面的代码在接收到请求后会显示一个登录成功的跳转提示,3s后会自动跳转到index.html页面;
String message = "<meta http-equiv=‘refresh‘ content=‘3;url=/W/index.html‘><a href=‘/W/index.html‘>AAAA</a>"; this.getServletContext().setAttribute("message", message);this.getServletContext().getRequestDispatcher("/message.jsp").forward(req, resp);// 将消息(message)带到message.jsp页面进行显示;
编写URL技巧: 先写‘/‘, 给服务器用的就不用写web应用程序名称;给浏览器用的就加上web应用程序名称
‘/‘代表当前web应用,写资源路径的时候先写‘/‘代表当前web应用;
InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");// 得到资源绝对路径;
二、程序编码
程序response响应对象以什么码表输出,就一定要控制浏览器以什么码表打开;可以使用html中的meta技术模拟http响应头,来控制浏览器的行为;
out.write("<meta http-equiv=‘content-type‘ content=‘text/html;charset=UTF-8‘>".getBytes());
也可以通过response响应对象来直接设置编码;
response.setCharacterEncoding("UTF-8"); // 设置response使用的码表,控制response以什么码表向浏览器写出数据; response.setHeader("Content-type", "text/html;charset=UTF-8"); // 指定浏览器以什么码表打开数据;
更简洁的写法
response.setContentType("text/html;charset=UTF-8");
获取request请求参数,在知道请求参数的编码方式的前提下,可以对请求参数进行编码转换:
request.setCharacterEncoding("UTF-8"); // 只对Post方式有效 // get方式处理乱码 String value = request.getParameter("username"); String out = new String(value.getBytes("iso8859-1"), "UTF-8"); System.out.println(out);
解决中文乱码大概有以下几种方式:
1、decode()方法
java.net.URLDecoder.decode(s)
2、设置字符集的方式
request.setCharacterEncoding("utf-8");
3、在页面上定义charset的字符集
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
4、在web.xml文件里定义编码,同时在CoreFilter类里定义编码为utf-8
<filter> <filter-name>encodingFilter</filter-name> <filter-class>com.demo.filter.CoreFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
5、在form表单里定义编码
accept-charset="utf-8" onsubmit="document.charset=‘utf-8‘;"
6、更改ContentTypes的值
改变eclipse里ContentTypes的值为utf-8
7、改变tomcat字符集
通过改变server.xml文件里的字符集来接收中文
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
三、设置session
Response.setDateHeader("expires", System.currentTimeMillis() + 1000*3600);// 设置session有效时间10分钟; Response.getWriter().write(data); Response.setHeader("refresh", "3");
四、压缩文件,告诉浏览器返回的是压缩文件
ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gout; try { gout = new GZIPOutputStream(bout); gout.write("dd".getBytes()); gout.close(); } catch (IOException e) { } byte[] gzip = bout.toByteArray(); response.setHeader("Content-Encoding", "gzip"); response.setHeader("Length", gzip.length + ""); response.getOutputStream().write(gzip);
五、重定向
response.setStatus(302);//重定向 response.setHeader("Location", "/first/MyJsp.jsp"); // response.sendRedirect("/first/MyJsp.jsp"); * 浏览器会向服务器发送两次请求,浏览器地址栏会发生变化,用户登录的时候/显示购物车时通常会用到重定向
ServletConfig
ServletConfig为具体的某一个servlet的配置信息;
实际开发中,有一些东西不适合在servlet程序中写死,这类数据可以通过配置方式配给servlet,例如:servlet采用哪个码表,接连哪个数据库,加载哪个配置文件;
String value = this.getServletConfig().getInitParameter("name"); <servlet> <init-param> <param-name>name</param-name> <param-value>XXXXX</param-value> </init-param> </servlet>
ServletContext
ServletContext:这是一个容器,容器的作用范围为整个应用程序;
一个web应用中的的所有servlet共享同一个ServletContext对象
String value = this.getServletContext().getInitParameter("datacontext"); <context-param> <param-name>datacontext</param-name> <param-value>xxdata</param-value> </context-param>
如果读取资源文件的对象不是servlet的话,就只能通过类装载器读取文件,但资源文件不宜太大,类装载器只加载一次;
class userinfo { static { InputStream in = userinfo.class.getClassLoader().getResourceAsStream("db.properties"); String path = userinfo.class.getClassLoader().getResource("db.properties").getPath(); // 通过类装载的方式得到文件的位置,再通过传统方式去读取资源文件。 }}
Servlet配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>FIle</servlet-name> <servlet-class>com.test.FileServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FIle</servlet-name> <url-pattern>/file</url-pattern> </servlet-mapping> </web-app>
Cookie & Session
request.getCookies();//获取所有cookie; response.addCookie(cookie);//添加cookie // Session是通过cookie的方式传给浏览器; HttpSession hs = request.getSession(); // 浏览器禁用了cookie的处理方法 String url1 = response.encodeURL("/CooSee/servlet/SeesionDemo1"); String url2 = response.encodeURL("/CooSee/servlet/SeesionDemo2"); out.print("<a href=‘" + url1 + "‘>购买</a></br>"); out.print("<a href=‘" + url2 + "‘>结账</a></br>"); request.getSession(false); // false,只获取,但不创建session;
Md5
MessageDigest md = MessageDigest.getInstance("md5"); byte[] md5 = md.digest(String.getBytes()); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(md5);