关于Javaweb的基础知识,和相关套路总结

169 阅读7分钟

javaweb 第二天

Cookie 的使用入门

Cookie 技术能将服务器端的一些数据保存在用户使用的客户端计算机中。这样一来,用户下次就可以直接通过自己的计算机访问到该数据,而不必再访问服务器。

  1. 在项目 JspProject 中创建服务端 response_addCookie.jsp 并写入以下代码:
<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>服务端</title>
    </head>
    <body>
        <%
            // 创建2个Cookie对象
            Cookie c1 = new Cookie("bookName","BlueBridge");
            Cookie c2 = new Cookie("author","yamiya");
            // 通过addCookie()方法,将Cookie对象设置到客户端
            response.addCookie(c1);
            response.addCookie(c2);

            response.sendRedirect("temp.jsp");
        %>
    </body>
</html>
  1. 创建客户端 temp.jsp,并写入以下代码。
<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>客户端</title>
    </head>
    <body>
        <a href="request_getCookies.jsp">客户端再次跳转</a>
    </body>
</html>
  1. 创建服务端 request_getCookies.jsp。
<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>客户端</title>
    </head>
    <body>
         <%
            // 通过request对象获取全部的Cookie对象
            Cookie[] cookies = request.getCookies();

            for(int i=0 ; i< cookies.length ; i++)
            {
                // 输出Cookie对象名和对象值
                out.print(cookies[i].getName()+"--"+cookies[i].getValue()+"<br/>");
            }
         %>
    </body>
</html>
  1. 先执行 response_addCookie.jsp,并在跳转后的页面 temp.jsp 里单击超链接,得到以下运行结果:(张三是另外应该实验的) image.png 可以发现,temp.jsp 中的超链接并没有携带任何参数,但跳转后的客户端 request_getCookies.jsp 页面却依然能获取到 Cookie 对象。这是因为,在 temp.jsp 页面中客户端得到的 Cookie 信息在点击超链接的过程中包含在 HTTP 请求头中传递到了 request_getCookies.jsp 。在客户端发送的请求中(超链接请求、表单请求等)可以包含非常丰富的内容,除了可以携带 URL 参数、表单数据外,还可以传递丰富的请求头信息,我们可以在浏览器中按 F12 可以查看

image.png

image.png 可以发现,请求头信息中包含着多个 Cookie 对象,每个 Cookie 对象都是以“键=值”的形式存在的,并且键为 JSESSIONID 的 Cookie 对象是由服务器自动产生的。 实际上,在客户端每次访问服务器时,服务器为了区分各个不同的客户端,就会自动在每个客户端的 Cookie 里设置一个 JSESSIONID,表示该客户端的唯一标识符。

实验:通过cookie实现记住用户名字

  1. 在项目中新建登录页 login_cookie.jsp,并写入以下代码。
<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>登陆页面</title>
    </head>
    <body>
        <%!
            String username ;
        %>
        <%
            Cookie[] cookies = request.getCookies() ;
                // 判断是否存在键为"username"的Cookie,若存在则获取该Cookie的值
            for(Cookie cookie:cookies)
            {
                if(cookie.getName().equals("username"))
                {
                    username = cookie.getValue();
                }
            }
        %>
        <form action="check_cookie.jsp" method="post" >
            用户名:<input type="text" name="uname" value=
            "<%=username==null ? "":username  %>"  /> <br/>
            密码:<input type="password" name="upwd" /><br/>
                <input type="submit" value="登录" />
        </form>
    </body>
</html>
  1. 新建登陆验证页面 check_cookie.jsp,写入以下代码。
<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>cookie</title>
    </head>
    <body>
        <%
            request.setCharacterEncoding("UTF-8");
            String name = request.getParameter("uname");
            // 将用户名保存在键为"username"的Cookie对象中
            Cookie cookie = new Cookie("username",name);
            response.addCookie(cookie);
            // 登录验证...
        %>
    </body>
</html>

程序运行结果如下图所示。

图片描述

第一次访问登录页 login_cookie.jsp 时,先输入用户名 张三 及密码并点击登录,之后如果再次访问登录页 login_cookie.jsp,就会看到页面已经保存了用户名,如下图所示。 图片描述 有可能没用Cookie也可以保存,这个是浏览器特性。

Cookie 的有效期

Cookie 在客户端保存的时间不是永久性的,它是有生命周期的,但可以通过 setMaxAge(int expiry) 方法或 web.xml 设置 Cookie 的有效期。本次实验通过案例来演示如何通过 setMaxAge(int expiry) 方法设置 Cookie 的有效期。 使用 setMaxAge(); 方法设置 Cookie 对象的有效期时,单位是秒。例如以下代码,首先通过 cookieExpiry.jsp 页面设置一个 Cookie 对象,然后再尝试通过 cookieExpiryResult.jsp 页面来获取该 Cookie 对象。

创建 cookieExpiry.jsp,写入以下代码:

<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>cookie设置</title>
    </head>
    <body>
        <%
            Cookie cookie = new Cookie("username","zhangSan");
            // 设置Cookie对象的有效期为60秒
            cookie.setMaxAge(60);
            response.addCookie(cookie);
        %>
    </body>
</html>

创建 cookieExpiryResult.jsp,写入以下代码:

<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>cookie到期</title>
    </head>
    <body>
        <%
            Cookie[] cookies = request.getCookies();
            boolean flag = false;// 用来标识名为"username"的cookie是否存在
            if(cookies != null)
            {
                for(int i=0 ; i<cookies.length; i++)
                {
                    if(cookies[i].getName().equals("username"))
                    {
                        out.print("username:"+cookies[i].getValue());
                        flag = true ;
                    }
                }
            }
            //如果名为"username"的cookie不存在
            if(!flag)
            {
                out.print("Cookie已消失!");
            }
        %>
    </body>
</html>

首先执行 cookieExpiry.jsp 来设置 Cookie 对象,如果在 60 秒以内运行 cookieExpiryResult.jsp,则运行结果如下图所示。

图片描述

如果超过 60 秒以后,再次运行 cookieExpiryResult.jsp,运行结果如下图所示。

图片描述

session 的常用方法

session 内置对象是 javax.servlet.ServletContext.HttpSession 接口的实例化对象,常用方法如表所示。

方 法简 介
public String getId()获取 sessionId
public boolean isNew()判断是否是新的 session(新用户)
public void invalidate()使 session 失效
public void setAttribute(String name, Object value)设置 session 对象名和对象值
public Object getAttribute(String name)根据 session 对象名,获取 session 对象值
public void setMaxInactiveInterval(int interval)设置 session 的有效非活动时间, 单位是秒
public int getMaxInactiveInterval()获取 session 的有效非活动时间,单位是秒

下面是使用 session 的一个具体示例。

  1. 先在服务器通过 createSession.jsp 页面设置一个 session 值。
<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>cookie到期</title>
    </head>
    <body>
        <%
            // session是内置对象,因此可以直接使用,而不用自己去创建
            session.setAttribute("school","BlueBridge");
            response.sendRedirect("createSessionResult.jsp");
        %>
    </body>
</html>
  1. 然后响应给客户端页面 createSessionResult.jsp
<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>cookie到期</title>
    </head>
    <body>
        <%
            // 获取session的值
            out.print("sessionId:"+session.getId()+"<br/>");
            Cookie[] cookies = request.getCookies();
            // 前面学Cookie时已经知道,Cookie中会默认保存一个jsessionId的名和值
            // 获取Cookie中jsessionId的名和值
            out.print(cookies[0].getName()+"---"+cookies[0].getValue());
        %>
    </body>
</html>
  1. 执行 createSession.jsp,运行结果如下图所示。 图片描述

由图可以发现,服务器中 session 对象产生的 sessionId 值,与客户端中 Cookie 对象产生的 jsessionId 值的内容是一样的,在实际开发中 cookie 对象和 session 对象通常是一一对应的,并且可以通过 sessionId 和 jsessionId 对应起来。

实验:使用 session 实现登录注销

实现思路:用户首先进行登录操作,如果登录成功,则将用户的登录信息保存在一个 session 范围的属性里。当用户再访问其他页面时,先在 session 范围内寻找是否存在用户的登录信息;若存在,则表示是已经合法登录过的用户;若不存在,则表示该用户尚未登录,从而直接跳转到登录页面,要求用户重新登录。若用户登录成功,还可以进行注销操作。登录流程如图所示。

图片描述

登录页 loginDemo/login.jsp: 使用 form 表单录入用户名(uname)和密码(upwd)。

<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>登陆页面</title>
    </head>
    <body>
        <form action="check.jsp" method="post" >
            用户名:<input type="text" name="uname"/> <br/>
            密码:<input type="password" name="upwd" /><br/>
                <input type="submit" value="登录" />
        </form>
    </body>
</html>

登录判断页 loginDemo/check.jsp

<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>登陆判断</title>
    </head>
    <body>
       <%
            // 将post请求方式的编码设置为UTF-8
            request.setCharacterEncoding("UTF-8");
            
            String name = request.getParameter("uname");
            String pwd = request.getParameter("upwd");
            // 假设用户名是zhangsan,密码是abc
            if (name.equals("zhangsan") && pwd.equals("abc")){
                // 登录成功后,将用户信息保存在session的作用域内
                session.setAttribute("loginName", name);
                // 设置session的非活动时间为10分钟
                session.setMaxInactiveInterval(60 * 10);
                // 将请求信息,转发到welcome.jsp页
                request.getRequestDispatcher("welcome.jsp").forward(request, response);
            }else{
                // 若登录失败,返回登录页login.jsp
                response.sendRedirect("login.jsp");
            }
        %>
    </body>
</html>

登录成功后的欢迎页 loginDemo/welcome.jsp

<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>欢迎你</title>
    </head>
    <body>
       <%
            // 进入welcome.jsp页面前,先通过session的作用域内判断用户是否已经登录
            // 如果还没登录,则跳到登录页
            String loginName = (String) session.getAttribute("loginName");
            if (loginName == null)
            {
                // 用户还没登录
                response.sendRedirect("login.jsp");
            }else
            {
                out.print("登录成功!欢迎您<strong>" + loginName + "</strong><br/>");
                out.print("<a href='logout.jsp'>注销</a>");
            }
        %>
    </body>
</html>

注销页 logout.jsp

<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>注销</title>
    </head>
    <body>
      <%
            // 进入logout.jsp页面前,先通过session的作用域内判断用户是否已经登录
            // 如果还没登录,则跳到登录页
            String loginName = (String) session.getAttribute("loginName");
            if (loginName == null)
            {
                // 用户还没登录
                response.sendRedirect("login.jsp");
            }else
            {
                // 使session范围中的属性全部销毁,即清除之前session中的loginName属性
                session.invalidate();
                response.sendRedirect("login.jsp");
            }
        %>
    </body>
</html>

可以发现,如果输入正确的用户名和密码,则直接跳转到欢迎页,如下图所示。

图片描述

如果用户名或密码输入有误,则返回登录页。而且如果用户没有登录,则直接访问 welcome.jsp 或 logout.jsp,也会因为 session 作用域中的 loginName 为 null 而直接跳转返回登录页,从而实现访问权限的控制。

图片描述

最后,再说明一下 Cookie 和 session 的几点区别,如下表所示。

Cookiesession
保存信息的位置客户端服务器端
保存的内容字符串对象
安全性不安全安全

JSP 内置对象:application

application 对象是 javax.servlet.ServletContext 接口的实例化对象,代表了整个 Web 项目,所以 application 对象的数据可以在整个 Web 项目中共享,用法上类似于“全局变量”的概念 application 对象的常用方法如下表所示:

方 法简 介
public String getContextPath()获取虚拟路径(默认是项目名称)。
public String getRealPath(String path)获取虚拟路径对应的绝对路径。
  1. 创建 applicationDemo.jsp 文件,并写入以下代码。
<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>application</title>
    </head>
    <body>
        <%
            String realPath = application.getRealPath("/");
            String contextPath = application.getContextPath();
            out.print("realPath:"+realPath+"<br/>");
            out.print("contextPath:"+contextPath);
        %>
    </body>
</html>

图片描述

重启 Tomcat,在地址栏的末尾加上 /JspProject/src/main/webapp/applicationDemo.jsp 得到以下运行结果。

图片描述

可以发现,虚拟路径是项目名;而虚拟路径对应的绝对路径,是在工作目录中的某一个文件夹。默认情况下,Tomcat 会将虚拟路径设置成 webapps目录,但是,如果将所有的Web项目都放在webapps里也是不合理的。要想把Web项目放置到webapps以外的目录并能被Tomcat识别,就必须配置。通常,可以通过配置 Tomcat 中 server.xml 的 Host 元素进行虚拟路径的配置,如下,docBase 指定本地磁盘上的普通目录;path 指定 Tomcat 访问时的虚拟目录,可以使用绝对路径或相对路径。换句话说,当用户访问path指定的虚拟目录( /JspProject )时,就会自动访问docBase指定的本地目录(\MyWebApps\JspProject)。

<Host appBase="webapps" autoDeploy="true" name="localhost" … >
    <Context docBase="MyWebApps\JspProject" path="/JspProject" />
</Host>

总结:

输出:out.print(),<%=%>
开发套路:
1.建一个web项目
2.基本格式

<%@ page pageEncoding="UTF-8"%>
<html>
    <head>
        <title>标题名字</title>
    </head>
    <body>
    前端代码,比如超链接,表单,标题等
      <%
         java代码,比如request获取页面元素之类  
        %>
    </body>
</html>

3.一般登录页面,需要一个登录的jsp,在from表单里面跳转到检查页面,如果检查成功,转发或者重定向到成功页面,失败可以不处理,可以跳转登录页面,可以直接输出失败。
4.request通过setCharacterEncoding设置编码格式
通过getParamete(“name”)获取表单元素{ps:表单里面元素需要手动添加name,类似前端的id那种类似} 获取元素后,可以输出,也可以检查是不是和xx相同
5. 】通过response.sendRedirect("地址名字")转发到该地址
】通过request.getRequestDispatcher("地址名字").forward(request,response),重定向到地址

cookie(写在<%里面%>)
创建:
Cookie c1 = new Cookie键,值);
获取
Cookie[] cookies = request.getCookies();
for(int i=0 ; i< cookies.length ; i++)
{
}
创建session:session.setAttribute(键,值);
session的值
out.print("sessionId:"+session.getId()+"
");
注销session:session.invalidate();