1.转发和重定向
转发:
服务器端行为。客户端只发送一次请求,服务器端将该请求在内部实现共享(request和response).
request.getRequestDispatcher("show.jsp").forward(request, response); |
重定向:
客户端行为。客户端发送第一次请求,服务器端返回302状态码和新的请求路径(location);客户端拿到该数据,向新的路径发送第二次请求。
response.sendRedirect("show.jsp"); |
servlet处理java代码,jsp用于展示。
2.ServletContext
application域对象,作用域:整个应用程序有效。
有且只有一个。
getServletContext() ServletContext application = getServletContext(); application.setAttribute("user", username); |
不建议存放过多数据
3.什么是会话
会话可以代表与服务器端的一次连接。
通过三次握手域服务器建立连接,此时会话开始;
会话超时或者主动断开连接此时会话失效。
一次会话之内可以有多次请求和响应。
-
- cookie和session
会话跟踪技术。
cookie: 一段保存于客户端的文本。
//创建cookie Cookie cookie = new Cookie("user", username); //响应cookie到浏览器 response.addCookie(cookie); 有效时长: 默认: 关闭浏览器,cookie失效 手动设置: cookie.setMaxAge(1); 秒
获取cookie: Cookie[] cookies = request.getCookies() getName():获取name值 getValue():获取value值 |
session: 域对象(保存用户信息,实现登录验证)
HttpSession session = request.getSession(); session失效:
关闭浏览器session不会失效(sessionid) |
4.el和jstl
el: expression language
获取域中的数据
<% request.setAttribute("user", "zs");
UserInfo info = new UserInfo(); info.setUname("zs"); request.setAttribute("user", info);
List list = new ArrayList(); list.add("aa"); list.add("bb"); list.add("cc"); request.setAttribute("li", list);
Map map = new HashMap(); map.put("name", "zs"); map.put("age", 12); request.setAttribute("map", map); %> ${user.uname } ${li[0] } ${map.name } |
jstl:标签
- 需要导入jstl的jar(standard.jar,jstl.jar)
- 导入声明的标签库,使用标签
<c:if test="${score>80 }"> 奖励一个大红花! </c:if>
<!-- 多分枝 --> <c:choose> <c:when test="${score>80 }"> 奖励一个大红花! </c:when> <c:otherwise> 奖励一个大巴掌! </c:otherwise> </c:choose>
<!-- items:遍历的内容,支持el表达式 var:每个元素名称--> <c:forEach items="${li }" var="aa"> <p>${aa }</p> </c:forEach> |
5.过滤器(Filter)
过滤请求和响应。
场景:
- 全局编码设置
- 用户登录验证(首页,登录页面,登录处理servlet不能拦截)
- 敏感词汇过滤
//处理接收请求和响应 过滤器链 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //设置编码 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //放行 chain.doFilter(request, response); } |
6.监听器
监听域对象(request/session/application)的创建销毁,以及属性的变化。
@WebListener public class MyApplicationListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) { System.out.println("application销毁"); }
public void contextInitialized(ServletContextEvent ev) { Map<String, Integer> map = new HashMap<>(); ev.getServletContext().setAttribute("map", map); }
} |
应用:
分ip统计show.jsp的访问次数。
- 监听application域创建,创建map集合管理ip及访问次数
- 创建filter过滤show.jsp的请求
- 在dofIlter方法中获取ip地址,从map中根据ip地址获取访问次数;
如果为null,设置访问次数为1;否则访问次数+1.
7.Ajax
异步javascript和xml。
能够实现异步请求发送。
同步请求: 请求发送需要等待之前一次请求的响应。
异步请求: 请求发送不需要依赖于其他请求的响应。
- 能够实现局部刷新
- 缺点: 增加服务器压力
原生ajax:
var val = ele.value; //1.创建XMLHttpRequest对象 var xhr = new XMLHttpRequest(); //2.打开链接(发送的url,请求方式) xhr.open("get","ajax?key="+val); //3.发送请求 xhr.send(null); //4.处理响应数据 //监听请求状态 //xhr.readyState:请求状态 (0-4) var oDiv = document.getElementById("div2"); xhr.onreadystatechange = function(){ if(xhr.readyState == 4 && xhr.status == 200){ oDiv.innerHTML=xhr.responseText; } } |
jQuery的Ajax:
$.get("ajax?key="+val,function(data){ $("#div2").html(data); }); $.post("ajax",{"key":val},function(data){ $("#div2").html(data); }); |