Servlet(二)
2018-12-19 本文已影响11人
强某某
重定向
- 地址变了
- 浏览器做了两次请求
- 可以跳转任何位置即使不是自己项目
- 无法使用上一次请求的res,因为是两次请求
请求转发
- 地址栏不变
- 一次请求
- 服务端内部帮客户端执行工作
- 只能跳转自己项目,效率高
public class Login extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username);
response.setContentType("text/html;charset=utf-8");
if (username.equals("root")&&password.equals("123")) {
//重定向:地址变了
//浏览器做了两次请求
//可以跳转任何位置即使不是自己项目
//无法使用上一次请求的res,因为是两次请求
/**
* 早期写法:
* response.setStatus(302);
* response.setHeader("Location", "success.html");
*/
response.sendRedirect("success.html");
//请求转发:地址栏不变,一次请求,服务端内部帮客户端执行工作,只能跳转自己项目,效率高
// request.getRequestDispatcher("success.html").forward(request, response);
}else{
response.getWriter().write("密码错误");
}
}
Cookie
public class Login extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie cookie=new Cookie("name", "qiang");
//设置cookie有效期,默认情况下是-1(负值代表关闭浏览器即失效)
cookie.setMaxAge(3600*24);//秒为单位,此时为一天有效期
//设置有效域
// cookie.setDomain(pattern);
//设置新值
// cookie.setValue(newValue);
//设置有效路由
// cookie.setPath(uri);
//给响应添加cookie
response.addCookie(cookie);
//清除cookie,记得一定要add进去
Cookie cookie2=new Cookie("name", "");
cookie2.setMaxAge(0);
//获取cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
response.getWriter().write(cookie.getValue());
}
}
}
}
Session
session默认时间是30分钟(tomcat配置文件规定的,可修改),另外关闭服务器也会销毁
// 创建session
HttpSession session = request.getSession();
// 得到会话的id
String id = session.getId();
// 设置数据
// session.setAttribute(arg0, arg1);
// 获取数据
// session.getAttribute(arg0);
// 移除数据
// session.removeAttribute(arg0);
//强制让会话失效,内部数据也都没有了
// session.invalidate();
JSP
- 全局变量<%! int a=10>
- 局部变量<%@ int a=10>
- 使用变量<%=b/a>
JSP三大指令
<%@ 指令名称%>
Page指令
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
-- pageEncoding:jsp文件的编码格式
-- extends: 用于jsp指定jsp翻译成java文件后继承的父类
-- session: true/false 用于控制,在该jsp页面否能直接使用session对象
-- errorPage: 值是错误页面的路径
-- isErrorPage: 代表当前jsp页面时错误信息页面,一般配合上一个使用(获取错误信息:exception.toString())
include指令
包含其他jsp页面
静态包含:另外一个页面所有内容都包含进来,包括title等等
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="other.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
index页面
</body>
</html>
说明:include可以在任意位置,但是位置影响了界面的上内容显示的位置
taglib标签
引入标签库
<%@ taglib prefix="" uri="" %>
-- prefix:标签库的路径
-- uri: 标签库的别名
JSP的动作标签
<body>
<!-- 包含制定的页面,这是动态包含,也就是不把包含的页面所有元素标签全部拿过来输出,
而是把它的运行结果拿过来;但是html源码和上面的静态包含相同,只有看java源码才能看出来区别 -->
<%-- <jsp:include page="other.jsp"></jsp:include> --%>
<!-- 在包含某个页面或者跳转某个页面的时候,加入这个参数 -->
<%-- <jsp:param value="" name=""/> --%>
<!-- 前往其他页面 ,等同于请求转发-->
<jsp:forward page="other.jsp">
<jsp:param value="beijing" name="address"/>
</jsp:forward>
</body>
</html>
获取参数:在other.jsp中
<%=request.getParameter("address") %>
JSP内置对象(九个)
可以在jsp页面上直接使用的对象,不用创建
四大作用域对象
存储和取数据都是 setAttribute和getAttribute
- pageContext:当前页面(pageContext),通过当前对象可以拿到其他八个对象,但是一般不这么使用
- request: 一次请求(HttpServletRequest)
- session:一次会话(多次请求与响应,但是浏览器关闭了则属于其他会话,HttpSession)
- application:整个工程,服务器关闭后不能访问,其实是servletContext
- out:(JspWriter)注意out的内容其实是放到response.getWriter的缓冲区中才输出,
所以如果出现out和response.getWriter的输出,即使out在上面也是
response.getWriter的先输出,而且jsp内部的普通文本不含任何标签的,
也是默认使用out输出的,所以也会在response.getWriter输出的内容之后
- response:(HttpResponse)
- exception(isErrorPage中才有):输出错误才使用(Throwable)
- page:当前jsp翻译的java类的实例(Object)
- config:servletConfig
![](https://img.haomeiwen.com/i1334027/4331ddc9696664d1.png)
EL表达式
简化jsp中java代码的书写 ${}
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<% pageContext.setAttribute("name","qiang"); %>
<% application.setAttribute("name","qiang1"); %>
<% session.setAttribute("name","qiang2"); %>
<% request.setAttribute("name","qiang3"); %>
<p>使用EL表达式获取值</p>
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }
<p>存储数组</p>
<%
String[] arr={"a","b","c"};
pageContext.setAttribute("arr",arr);
%>
${arr[0] }
<p>存储集合</p>
<%
List arr1=new ArrayList<String>();
arr1.add("aa");
application.setAttribute("arr1",arr1);
Map arr2=new HashMap();
arr2.put("aaa",18);
session.setAttribute("arr2",arr2);
%>
<!-- 如下方式:如果不指定域,则依此从pageContext request session application找 -->
${arr1[0] } ${arr2.aaa }
<br/>
<!-- 还可以做一些简单判断,例如|| > + - * / 等 -->
${empty arr1 }
</body>
</html>
EL表达式是十一个内置对象
- pageContext:页面上下文
> 作用域相关
- pageScope
- requestScope
- sessionScope
- applicationScope
- header:头信息
- headerValues
- param:参数信息
- paramValues
- cookie
- initParams:全局初始化参数
JSTL
替换<%%>写法,一般与EL表达式配合,偏向于逻辑
1.导入jar包
![](https://img.haomeiwen.com/i1334027/efaa493b9d6286c6.png)
2.在jsp文件中导入jstl,一般只使用核心包即可
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用标签:
<c:if test=""></c:if>
<c:set></c:set>
<c:forEach></c:forEach>
基本案例:
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 使用jstl使用1.1版本,1.0版本不支持el表达式 -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 默认把值存储到pageScope中,但是可以指定scope -->
<c:set value="qiang" var="name" scope="session"></c:set>
${sessionScope.name }
<c:set value="18" var="age" scope="session"></c:set>
<!-- 此处的var指的是if的判断结果存储到域中,一般是一个布尔值,默认是page,注意此时
书写的时候不是pageScope而是page,是jstl的规定,其实就是pageScope
-->
<c:if test="${age>10 }" var="flag" scope="page" >年龄大于10</c:if>
<c:if test="${age<=10 }">年龄小于等于10</c:if>
<!-- step是步数 -->
<c:forEach begin="1" end="10" var="i" step="2" >
${i }
</c:forEach>
<%
List list=new ArrayList();
list.add(new User("zhangsan",18));
%>
<!-- 遍历对象,注意此处 items内部必须是el表达式,内部是要遍历的对象-->
<c:forEach var="user" items="${users }" >
${user.name }--${user.age }
</c:forEach>
</body>
</html>