8- jsp

jsp

1. JSP介绍

1.1 什么是JSP
  • JSP(Java Server Page)是JavaEE规范中的Web组件,用来编写动态页面;
  • JSP文件以.jsp为后缀,在工程目录中存在WebContent目录下,跟静态资源使用方式非常相似;
  • JSP文件中的内容就是 HTML+Java代码,静态部分使用HTML和文本即可,动态部分使用Java代码;
1.2 Jsp本质
  • 结合由tomcat自动生成的jsp相关java文件,

理解Web容器处理JSP文件请求需要经过3个阶段

  1. 翻译阶段
  2. 编译阶段
  3. 执行阶段

1、翻译:Web服务器找到test.jsp,对其进行翻译,生成test_jsp.java文件;查看路径: 工作空间 work\Catalina\localhost

2、编译:服务器将test_jsp.java编译成类文件,翻译和编译的过程遵守Servlet规范,

3、实例化并提供服务:服务器实例化类,调用类中的_jspService方法提供服务

  • 总结:
  1. Servlet生成动态页面比较繁琐,使用JSP生成动态页面比较便捷,因为其中的静态内容可以使用HTML生成;
  2. JSP的执行过程是:翻译-编译-实例化-提供服务;
  3. JSP的本质就是Servlet,不过是服务器将JSP进行了翻译和编译;可以说,JSP也是一个Java类;

2. Jsp语法格式

Jsp中嵌入java代码的格式

	Page指令(配置页面基本信息)
<%@ page 属性1="属性值" 属性2="属性值1,属性值2"… 属性n="属性值n"%>

	Include指令(file="路径" 使用项目相对根路径 不需要手动拼项目名
                  作用:  1.引入公用的html部分
                        2.引入公用的java部分)
     <%@ include file="left.jsp" %>        //引入了文件名为left的

	小脚本
<%	%>     小脚本中可以直接声明变量

	输出信息到页面
<%=	%>   直接输出信息到页面,不能带分号

	声明
<%! %>      声明中定义方法

	注释   
<%-- --%>  与<!-- -->区别 <%-- --%>不出现在页面中

3. Jsp九种内置对象及4种作用域

3.1 什么是的内置对象
  • Jsp文件翻译成java文件时,有一些对象被自动写在了java文件中,这些被自动写进去的对象叫内置对象。
3.2 九种内置对象
1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。

2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

7、config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

8、page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 

9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
3.3 四种作用域
使用的对象          作用域名  
ServletContext        application域
HttpServletRequet  	request域
HttpSession        	session域
PageContext        	page域

4. Jsp与servlet配合使用

4.1 Jsp与servlet分工
servlet与jsp一般配合使用
servlet 请求接收 数据控制(调用业务方法) 控制由哪个页面展示结果
jsp     展示数据 静态技术  少量java代码
4.2 跳转方式
  • 响应重定向
响应重定向 通过response对象调用,让浏览器向重定向的地址重新发送一次请求
response.sendRedirect("error.jsp");

注意:因为重定向会发送新的请求,会导致第一次请求的相关数据在第二次请求中读取不到,如果我们需要这些数据可以使用转发的跳转方式。

  • 请求转发
请求转发 通过request对象调用,把请求对象和响应对象与要跳转的地址共享
request.getRequestDispatcher("showIP.jsp").forward(request, response);
  • 两者区别
转发(较常用效率更高)重定向
浏览器URL不变浏览器URL的地址栏改变
服务器行为(服务器内部)客户端行为(告诉客户端重新请求)
浏览器只做了一次访问请求浏览器做了至少两次的访问请求的
2次跳转之间传输的信息不会丢失2次跳转之间传输的信息会丢失(request范围)
跳转方式
         1.响应 重定向   浏览器发起多次请求
         servlet jsp 关联不紧密
        
          路径方式
          1.相对路径         通过../   退出目录  /目录名   进入目录
          2.项目相对根路径    /项目名/资源地址
          3.绝对路径         协议://地址/资源地址
        
         2.请求 转发     浏览器发起一次请求  多个处理单元 共享req resp
         servlet jsp 关联紧密 比较复杂的对象 集合的展示
                     使用request域 传值
                     req.setAttribute("testuser",u1);
        
           路径方式(只能在当前服务器跳转)
           1.相对路径
           2.项目相对根路径   /项目名(自动拼接 不需要手动写)   /资源地址

5.El表达式和jstl标签

1. El表达式
1.1 El表达式特点
  • 自动转换类型

EL得到某个数据时可以自动转换类型

对于类型的限制更加宽松

  • 使用简单

相比较在JSP中嵌入Java代码,EL应用更简单

  • EL的语法

以"${“作为开始,以”}"作为结束

1.2 El表达式操作
request域中
request.setAttribute(“testuser”,myuser);
使用el表达式取域中user对象的username属性,并输出到页面
${testuser.username}

操作符“.”
获取对象的属性,例如:${news.title}

操作符“[]”
获取集合中的对象,例如:${newsList[0]}

//${empty newsList}   //true 则是里面为空  false 则是不为空                 //一般${not empty newsList}判断

El表达式中允许使用运算符

在这里插入图片描述

1.3 El表达式隐式对象

EL表达式包含一些隐式对象

  • 作用域访问对象 可用来指定从某个域中取值 默认从上到下取值
  • ( $(requestScope.testuser.username) 表示从requestScope里找 testuser这个对象 不加 默认从上到下)

pageScope

requestScope

sessionScope

applicationScope

  • 参数访问对象 可指定从request的参数部分取值

param

paramValues

  • Jsp配置对象

pageContext

pageContext.request.contextPath ----> 项目根路径

2. Jstl标签
1.1. Jstl标签作用
  • El表达式主要是取值和输出功能,需要配合jstl标签来完成逻辑控制(条件判断、循环)

  • JSTL(JavaServerPages Standard Tag Library) jsp基本标签库,主要用来替换页面中跟逻辑判断相关的java代码,经常和el表达式配合使用

1.1. Jstl使用

Jstl需要jar包支持

http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

下载jstl.jarstandard.jar

在使用jstl的页面中,需要加入taglib指令,导入核心标签库

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

1.2 Jstl中常用标签

通用标签

set:设置指定范围内的变量值

out:计算表达式并将结果输出显示

remove:删除指定范围内的变量

<c:set var= "example" value="${100+1}" scope="session"  />	 //var--key键   value--值   scope---放在哪个域
<c:out value="${example}"/>                                  //out:输出显示
<c:remove var= "example" scope="session"/>                   //remove:删除

条件标签

If:条件判断语句

<c:if test="${empty loginUser }" var="islogin" scope="session">
<!--test:判断条件     可以将结果保存在域中 var是key  scope是域 -->
		<c:redirect url="testEL.jsp"></c:redirect><!--配合跳转标签使用 -->
</c:if>


<c:if test="${not islogin}">
<!--对之前保存的判断结果取反 完成else结构 -->
	已登录
</c:if> 

迭代标签

forEach:遍历集合中的元素时使用

<c:forEach items="${listEitity }" var="myentity">
<!--items是遍历的集合      var是每次遍历到的对象 每次会存在域中 -->			<tr><td>${myentity.ename }</td><td>${myentity.eage }</td><td>${myentity.eaddr }</td></tr>
<!--遍历中取值直接使用遍历到并存在域中的key,通过el表达式取值 -->
</c:forEach>


例子:
<table class="table">
    <thead>
    <tr><th>用户id</th><th>姓名</th><th>密码</th><th>备注</th><th>电话</th></tr>
    </thead>
    <tbody>
    <c:forEach items="${listUser}" var="myuser">
        <tr>
            <td>${myuser.userId}</td>
            <td>${myuser.userName}</td>
            <td>${myuser.userPwd}</td>
            <td>${myuser.userPhone}</td>
            <td>${myuser.userRemark}</td>
        </tr>
    </c:forEach>
    </tbody>
</table>

6.Cookie

1 会话跟踪
  • 什么叫会话跟踪

​ 在无状态(一次请求响应就结束)的HTTP协议下,想要跟踪用户的路径(知道是谁,在干什么,要去哪)需要通过其他技术来辅助实现。

  • 会话跟踪实现方式

​ 常用的会话跟踪技术有四种

1. URL方式:需要保存的信息直接追加到URL后,
例如:http://127.0.0.1:8080/chapter03/viewList?pageNo=12

2. 隐藏域方式:可以使用表单中的隐藏域保存相关信息, 例如:
input type="hidden" name="status" value="true">

3. Session方式:将状态信息保存到服务器的会话对象中,通过唯一标记的ID值
与客户端进行绑定使用;例如访问控制功能就可以使用Session实现

4. Cookie方式:将状态信息保存到客户端,服务器能够获得相关信息进行分析,
从而生成对客户端的响应;例如简化登录功能就可以使用Cookie实现;
2 Cookie介绍
  • Cookie译为小型文本文件或小甜饼,Web应用程序利用Cookie在客户端缓存服务器端文件。Cookie是以键值对形式存储在客户端主机硬盘中,由服务器端发送给客户端,客户端再下一次访问服务器端时,服务器端可以获取到客户端Cookie缓存文件。
  • Cookie是由服务器端创建的,然后由服务器端发送给客户端,客户端以键值对形式存储Cookie,并标注Cookie的来源。客户端再次访问服务器端时,存储的Cookie会保存在请求协议中,服务器端可以获取上次存储的缓存文件内容。

Cookie特点

  • Cookie的用途:

    电子商城中购物车功能(每买一样商品,保存一个Cookie)

    用户自动登录功能(第一次登录时,将用户名和密码存储在Cookie)

  • Cookie的缺点:

    多人共用一台计算机(例如导致用户名和密码不安全等问题)。

    Cookie被删除时,利用Cookie统计用户数量出现偏差。

    一人使用多台计算机(网站会将看成多个用户等问题)

    Cookie会被附加在每次Http请求协议中,增加流量。

    Cookie使用明文(未加密)传递的,安全性低。

    Cookie的大小限制在4KB左右,无法存储复杂需求。

  • Cookie规范

    Http协议提供了有关Cookie的规范,现今市场上出现大量浏览器,一些浏览器对该Cookie规范进行了一些“扩展”,但Cookie缓存文件不会占满硬盘空间。

    Cookie存储的大小上限为4KB。

    一个服务器最多在客户端浏览器中可以保存20个Cookie。

    一个浏览器最多可以保存300个Cookie。

3 Cookie主要属性
name:cookie的名字,每个cookie都有一个名字;
content:cookie的值,与名字一起作为键值对形式存在;
domain:域,该cookie的域名,例如csdn.net,说明当前cookie来自csdn.net;
path:路径,访问csdn.net下该路径时,当前cookie将被发送;
created:cookie被创建的时间;
Expired:cookie失效的时间;
最大生命时间:失效时间和创建时间的时间差,就是cookie的最大生命时间,超过该时间,cookie将失效,不再被发送到相应的域地址;

//cookie在浏览器中 可以修改 可以禁用
//只放跟用户相关的数据(不要放关键数据)
4 Cookie操作(java部分)
	写cookie
//创建/修改cookie对象,键值对形式
Cookie cookie = new Cookie("username", "admin");

//设置过期时间 单位秒,删除Cookie只需要修改过期时间为负数
//正数 有效秒    0  设置cookie失效    负值 -1  设置为浏览器关闭即失效
cookie.setMaxAge(60*60);
//cookie还可以设置path等信息

//cookie对象存入response,响应给浏览器,浏览器接受到响应数据时才会把cookie存储在本地
response.addCookie(cookie);    //写Cookie 最后必须有这一步

	读cookie
//从request对象中取值
Cookie[] cookies = request.getCookies();
//循环输出值
for(Cookie ck : cookies){
	 String ckkey = ck.getName();   //键:
	String ckval = ck.getValue();   //值:
}


//JSESSIONID  服务器自动创建的cookie  值是cookie的id
//服务器是否重新创建cookie 是由jsessionid决定的
5 Cookie操作(js部分 即浏览器那边)
	Cookie写
document.cookie="jscook=jsval1;path=/;expires="+new Date("2021-11-11 11:11:11");
//直接创建--> jscook-键 jsval1-值; path=/ 路径是/; 到期时间2021-11-11 11:11:11   

	Cookie读
var cookie =  document.cookie //读到键值对格式的字符串 如果需要找到特定key的value需要手动解析    //只有键值对
var mycks = document.cookie.split(";");
		$.each(mycks,function(i,d){
			var kvarr = d.split("= ");
			console.log("key是:"+ kvarr[0]+" value是:"+kvarr[1]);
		})

	删除cookie
//document.cookie ="jskey=jsval2;path=/;expires="+new Date("2011-11-11 11:11:11");
document.cookie="jskey=jsval;path=/;expires="+new Date(now.getTime()-1000).toGMTString(); //上一秒时间直接让他过期

注意:cookie在使用时,相同domain,不同path下可以存储同名cookie,为了让cookie设置统一,和解决cookie读取权限问题,经常会把cookie的path直接设置到根/

7 Web storage使用

  • HTML5 提供了两种在客户端存储数据的新方法 统称Web storage:

localStorage - 没有时间限制的数据存储

sessionStorage - 针对一个 session 的数据存储,数据在浏览器关闭后自动删除

  • Web storage是一种设计由前端存储数据的技术,跟cookie有相似之处,但是因为设计给前端使用,所以操作上比cookie方便很多

  • Web storage操作

localStorage.username = "admin";//设置值
console.log(localStorage.username)//取值
localStorage.setItem("user", "user_name");//设置值
console.log(localStorage.getItem("user"));//取值

//以上两种方式存值/取值都可以
localStorage.removeItem("user");//移除指定的key
localStorage.clear();//清空所有的数据

注意:sessionStorage用法同localStorage

Web storage是前端的技术,跟服务端的session对象无直接关系

Web storage没有默认随请求发送到服务器的机制

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值