文章目录
1.jsp的9大内置对象(不用创建直接使用)
pageContext,page,页面
request 完成一次请求,response 响应对象
session 一次会话,application 整个服务器,exception 异常,out 输出对象 ,config 配置
2.4大作用域 (存储属性的范围不一样<作用域的范围>)
作用域从小到大的范围:pageContext-----request-------session------application
四大作用域都有以下两个方法:
pageContext.setAttribute(); 或 setAttribute(); 设置属性值的方法
pageContext.getAttribute(); 或 getAttribute(); 获取属性值的方法
-
page
一个页面,不能直接使用,靠pageContext完成,属性在一个页面有效
<%--a.jsp--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--pageContext设置了三个属性只能在当前页面访问--%> <% pageContext.setAttribute("msg","正确"); pageContext.setAttribute("name","张三"); pageContext.setAttribute("date",new Date()); %> <%--<%--%> <%-- String msg=(String)pageContext.getAttribute("msg");--%> <%-- String name=(String)pageContext.getAttribute("name");--%> <%-- Date date=(Date)pageContext.getAttribute("date");--%> <%--%>--%> <%--<%=msg%>--%> <%--<%=name%>--%> <%--<%=date%>--%> <%--服务端跳转--%> <jsp:forward page="b.jsp">
getAttribute();的返回值是Object类型,使用时要向下转型
<%--b.jsp--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String msg=(String)pageContext.getAttribute("msg"); String name=(String)pageContext.getAttribute("name"); Date date=(Date)pageContext.getAttribute("date"); %> <%=msg%> <%=name%> <%=date%> <%--运行b.jsp结果为 null null null--%>
-
request
一次请求,属性可以跨(一个)页面传递(有关联的页面),也可以通过多个页面跳转获取
如:a页面设置值,a页面通过服务端跳转到b页面,b页面通过服务端跳转到c页面,在c页面上书写获取值代码request.getAttribute(),则c页面可以获取到a页面的值,如果b页面没有跳转到c页面,则c页面则不能获取到a页面的值(实际开发中这样的请求转发是没有意义的)。
在request中客户端跳转获取不到值
<%--a.jsp--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% request.setAttribute("msg2","正确2"); request.setAttribute("name2","张三2"); request.setAttribute("date2",new Date()); %> <a href="b.jsp">b.jsp</a> <%-- 客户端跳转无法获取到值--%> <%--<jsp:forward page="b.jsp"/>--%><%--服务器跳转可以获取到值--%>
<%--b.jsp--%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String msg2=(String)request.getAttribute("msg2"); String name2=(String)request.getAttribute("name2"); Date date2=(Date)request.getAttribute("date2"); %> <%=msg2%> <%=name2%> <%=date2%> <%--运行b.jsp结果为 null null null--%>
-
session
一次会话,保存一个一个用户的信息,每个用户的信息都是相互独立的。客户端和服务器端跳转均能获取到值。session的销毁时间默认30分钟。
销毁session的三种方式:1.手动销毁;2.请求超时 默认30分钟;3.关闭浏览器
1.手动销毁;
<%--a.jsp--%> <% session.setAttribute("msg3","正确3"); session.setAttribute("name3","张三3"); session.setAttribute("date3",new Date()); %> <%--<jsp:forward page="b.jsp"/>--%> <a href="b.jsp">在b页面获取值</a>
<%--b.jsp--%> <% String msg3=(String)session.getAttribute("msg3"); String name3=(String)session.getAttribute("name3"); Date date3=(Date)session.getAttribute("date3"); %> <% out.print("获取值:"); %> <%=msg3%> <%=name3%> <%=date3%> <% out.print("\t\t销毁:"); %> <a href="c1.jsp">手动销毁</a>
<%--c.jsp--%> <% session.invalidate();//手动销毁 %> <a href="b.jsp">查看销毁后是否可以获取到值</a> <%--<jsp:forward page="b.jsp"/>--%>
执行并点击后依次执行结果为:在b页面获取值 =》获取值: 正确3 张三3 Wed Jan 19 21:20:56 CST 2022 销毁: 手动销毁=》查看销毁后是否可以获取到值===》获取值: null null null 销毁: 手动销毁
销毁后获取不到值
2.请求超时 默认30分钟;
找到所使用的Tomcat的安装路径,打开该目录下的conf中的web.xml文件(用记事本打开),找到
30
改为想要的默认时间,重新启动服务器即可。
3.关闭浏览器
-
application
运行在整个服务器中,服务器不关闭,就一直存在。<数据存储在application中是最耗内存的>(实例与其他三种类似)
**注意:**以上属性值都是存在服务器中,只是在实际开发中遵循一个原则,即:page可以完成请求的则不用request,request可以完成请求的则不用session,session可以完成请求的则不用application ,从而提高服务器的性能
3.服务器端跳转和客户端跳转的区别
服务端跳转:地址栏信息不变
<jsp:forward page="跳转.jsp"/>
<%--如果可能的话代码中的/不要省去,因为我省去了此处代码显示有错误--%>
客户端跳转:会改变地址栏信息
<a href="">跳转.jsp<a>
<script>
window.location.href="跳转.jsp";
</script>
4.Servlet介绍以及使用
Servlet是一个类,运行在服务端,处理客户端的请求和响应。
Servlet的生命周期
1.加载Web容器时,创建Servlet,通过init()初始化操作(只能初始化一次,即、表现:第一次操作Servlet比较慢)
2.通过service()或者doGet()或者doPost()处理客户端的请求
3.通过关闭服务器或者长时间没有发生调用来销毁servlet
创建Servlet:1.初始化<init();>2.处理客户端请求(请求方式:service()服务调度,doGet(),doPost())3.销毁servlet(destroy()方法)
Servlet运行原理图
@WebServlet("/HelloServlet")//配置servlet
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("创建servlet,完成初始化");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("处理客户端请求");
}
@Override
public void destroy() {
System.out.println("销毁servlet");
}
}
/*执行页面,在地址栏追加“/HelloServlet”,访问后在代码的控制台可以看到输出“创建servlet,完成初始化
处理客户端请求”
*/