方式一(重定向或外部跳):
使用response对象的sendRedirect(“跳转的页面”) response.sendRedirect(“跳转的页面”);
方式二(请求转发或内部跳):
请求转发器:通过request对象的getRequestDispatcher(“跳转的页面”)方法;获取请求转发器对象RequestDispatcher,使用该对象的forward()方法或者include()方法进行转发。
request.getRequestDispatcher(“页面路径”).forward(request,response);
外部跳和内部跳的区别:
内部跳,浏览器的地址栏不会发生改变;外部跳,客户端地址栏发生改变
内部跳,客户端请求一次;外部跳,客户端会重新发送一次新的请求。
内部跳,request中的数据可以传递到下一个页面;外部跳,request中数据会丢失。
乱码出现时期:
请求时 request
应答时 response
通过两个对象的setCharacterEncoding(“编码”)方法进行字符集指定:
request对象的该方法是对请求体中的数据进行编码。所以对post请求有效。而且还要在获取参数前调用该方法。
response对象的该方法对响应数据进行编码。也必须在getWriter之前调用。
如果表单是get方式提交,处理中文时,必须一个一个的处理;
get方式提交,中文会在浏览器的地址栏被编码(ISO-8859-1);
所以处理中文如下:
public void doPost(HttpServletRequest request,HttpServletRespons e response){ String name = request.getParamter(“txtname”);//name现在是乱码 //处理get方式的编码 name = new String(name.getBytes(“iso-8859-1”),”gbk”); }
解决乱码问题中,设置请求内容的字符编码?
reqeust.setCharacterEncoding(“utf-8”);
解决乱码问题中,设置输出内容及字符编码?
response.setContentType(“text/html;charset=utf-8”)
或者
response.setCharacterEncoding(“utf-8”);
什么是会话?
生活中:两个人,一次问答的过程,称为一次会话。
Web程序中:浏览器和服务器(TOMCAT),一次请求和响应的过程,成为会话。
什么是会话跟踪?
在多次会话的过程中,服务器要记录客户端的相关信息。这就叫做会话跟踪。
为什么需要会话跟踪?
因为Web程序使用的HTTP协议进行通信;http协议是一个无状态的协议,不会保留客户端的信息;如果需要让服务器保留客户端相关信息,就必须使用会话跟踪技术。
HttpServletRequest 的 getSession() 方法用于表示创建会话,是会话跟踪的核心对象,在Servlet中获取跟踪对象HttpSession,其语法如下:
HttpServlet session = request.getSession();
或者
HttpServlet session = request.getSession(boolean value);
如果没有与当前请求关联的会话,则 getSession() 方法用于创建会话。
如果布尔值为 true 且当前没有与请求关联的会话,则使用 getSession(boolean value) 创建会话。如果布尔值为 false,如果没有与当前请求关联的会话,返回null。
方法名描述
setAttribute(name,value) 将数据存放在session中
getAttribute(name) 根据名字从session中获取数据
removeAttribute(name) 根据名字从session中删除指定的数据
getMaxInactiveInterval() 返回session的最大有效时间(单位秒)默认30分钟
setMaxInactiveInterval (秒数)设置session的最大有效时间(时间值越小性能越高)
invalidate() 使session立即失效(session中的数据被清除);
一般用在退出系统。
URL(统一资源定位) 重写技术将一个唯一的会话 ID 添加到 URL 结尾,以标识该会话。例如,重写以下 URL 传递会话 jsessionid=5EF46DFRD98EFEFHOKH
原始 URL:http://server:port/servlet/Rewritten
重写的 URL:
http://server:port/servlet/Rewritten?jsessionid=5EF46DFRD98EFEFHOKH
注意:当客户端禁用所有Cookie写入时,必须使用URL重写,才能完成会话跟踪
由于Servlet默认是以多线程模式执行的,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值,就会经常出现一些莫名奇妙的问题。
Servlet与线程安全
Public class Security extends HttpServlet { PrintWriter out = null; public Security(){super();} public void destroy(){super.destroy();} protected void service(……); out = response.getWriter(); String userName = reqeust.getParameter(“user”); try{ //为了突出并发问题,让线程睡眠5秒 Thread.sleep(5000); }catch(Exception e){ e.printStackTrace(); } out.print(“<br /> 用户:” + userName); } Public void init() throws ServletException { } }.
实现SingleThreadModel接口
Public class security extends HttpServlet implements SingleThreadModel {}
2、同步对共享数据的操作
Synchronized(this){ Out = response.getWriter(); try{ //为了突出并发问题,让线程睡眠5秒 Thread.sleep(5000); }catch(Exception e){ e.printStackTrace(); } }
3、避免使用实例变量
Public class security extends HttpServlet implements SingleThreadModel {}