Java

Servlet(二)

2018-12-19  本文已影响11人  强某某

重定向


  1. 地址变了
  2. 浏览器做了两次请求
  3. 可以跳转任何位置即使不是自己项目
  4. 无法使用上一次请求的res,因为是两次请求

请求转发


  1. 地址栏不变
  2. 一次请求
  3. 服务端内部帮客户端执行工作
  4. 只能跳转自己项目,效率高

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


  1. 全局变量<%! int a=10>
  2. 局部变量<%@ int a=10>
  3. 使用变量<%=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

区别.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包

需要的jar.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>
上一篇 下一篇

猜你喜欢

热点阅读