JSP
jsp概述
概念:全称java server page.java服务器页,根本是一个简化的servlet设计
在html文件中加入java程序片段和jsp标记,就构成了jsp网页
作用
主要代替servlet传输网页数据,servlet传输数据太麻烦
jsp文件第一次访问jsp->java->class 第二次访问直接访问编译后的class文件
jsp与servlet的联系与区别
概念:jsp本质上就是一个servlet,但是二者的创建方式不一样,jsp运行时会被编译为java文件,servlet完全是java程序代码构成
jsp主要用于视图显示(显示数据),servlet主要用于逻辑处理
jsp页面构成,指令元素
jsp页面由jsp指令,网页内容构成,java代码构成
<% java代码%>
<%
String str="jsp";/*定义变量*/
out.print(str);
%>
<%--注释内容--%>
<%--
String str="jsp";
--%>
注意:修改jsp文件不需要重启Tomcat服务器,修改web.xml,java代码,配置文件需要重新启动Tomcat
jsp指令对象
概念:jsp可以通过指令元素影响服务器编译成java类的整体结构
语法:<%@指令名 {属性名=“值”}*%>
常用的三个指令:page,include,taglib
page指令
概念:page指令为容器提供当前页面的使用说明,一个jsp文件可以包含多个page指令
<%@ page 属性=""%>
常用属性
<%@page pageEncoding="utf-8" %><%--设置编码格式--%>
<%@page language="java" %><%--定义语言类型--%>
<%@page contentType="text/html; ISO-8859-1" %><%--定义响应内容--%>
<%@page import="java.util.*,java.util.ArrayList" %><%--导包--%>
include指令
include指令就是就是用静态包含其他网页
静态包含:就是指编译期间,用包含的页面也编译到当前页面的java文件中,“合二为一”,数据可以共享.
<%@include file="Demo1.jsp"%>
动态包含:在jsp页面中动态包含另一个资源,分开编译,在运行期间访问被包含的页面,并将响应结果同包含页面的结果合并,生成最终响应
<jsp:include page="Demo1.jsp"></jsp:include>
jsp内置对象
在jsp页面中包含九个内置对象(不用声明和创建就可以使用)
out向客户端输出
request封装用户请求
response向用户做出响应
session客户和服务器间的对话
application于服务器启动时开始时运行
pageContext用于访问page的各种对象
exception异常
config初始化要用的参数
page jsp页面本身
out对象
out对象是javax.servlet.jsp.JspWriter的实例
out对象主要用于将内容写入jsp页面中实例的缓冲流
out对象中两个重要方法:print和println
out.print("hello world");
request对象
request对象是javax.servlet.http.HTTPServletRequest的实例,封装了一次请求,客户端的请求数据都被封装在给对象里.
请求转发
请求转发是指将请求再转发到另外一个资源,此过程在同一个请求范围中,转发后浏览器地址栏内容不变.
请求转发使用RequestDispatcher接口中的forward方法来实现,该方法可以把请求转发到另外一个资源,并响应到浏览器
RequestDispatcher requestDispatcher = req.getRequestDispatcher("success.jsp");//告诉转发的内容
requestDispatcher.forward(req,resp);//实际转发的动作
req.setAttribute(String name,object value);//将value属性存储到req对象中
req.getAttribute(String name);//返回name属性的值
removeAttribute(“name”);//移除name属性
response对象
response对象实现了javax.servlet.http.HTTPServletResponse的实例
重定向
重定向是指页面重新定位到某个新的地址,之前的请求失效,进入一个新的请求,并且跳转后浏览器地址发生改变
重定向通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求
重定向和请求转发的区别
session对象
HttpSession类的实例
session的生命周期
创建:会话开始时,在服务器创建
销毁:1.服务器关闭时
2.客户端长时间不与服务器交互(默认30分钟)
3.安全退出调用invalidate();
session对象用来管理会话(一个过程),从会话开始到会话结束的过程
会话:打开浏览器,连接到服务器,会话开始,关闭浏览器,会话结束
运行机制
1.客户端在第一次请求服务器端,会生成一个session对象(用于保存客户的信息)
2.每个session对象都会有一个唯一的SessionID
特点
session对象同一次会话数据共享
session储存在服务器端
session是在同一个用户请求时共享,即在同义词会话中,所有的页面可以访问到session,但是切换浏览器就要重新进行会话过程
注意:Session存储在服务器端.Cookie存储在客户端
application对象
是java.servlet.ServletContext的实例
这个对象在jsp页面的整个声明周期中都代表的这个jsp页面
通过向application中添加属性,所有组成web应用的jsp文件都能访问到这些属性
pageContext对象
是javax.servlet.jsp.PageContext的实例,用来代表整个jsp页面
exception对象
是java.lang.Throwable的实例
该实例代表其他页面中的异常和错误,只有当页面是错误页面,即page的isErrorPage属性为true是,该对象才可以使用
page对象
表示当前对象,相当于java中this
config对象
这个对象允许访问Servlet或jsp引擎的初始化参数
Cookie
通过cookie对象,可以从服务器端向客户端响应一些信息,这些信息存储在浏览器的内存中
设置cookie
-
创建一个cookie对象:调用cookie的构造函数,使用cookie名称和值作为参数
Cookie cookie = new Cookie(“account”,account);
-
设置有效期
cookie.setMaxAge();
-
将cookie发送到HTTP响应头
response.addCookie(cookie);
-
获取cookie值
使用java方法获取
Cookie []httpCookie =request.getCookies(); String password = ""; String account = ""; if (httpCookie!=null){ for (Cookie c:httpCookie){ if (c.getName().equals("acccok")){ account=c.getValue(); } if (c.getName().equals("pwdcok")){ password = c.getValue(); } } }
cookie和Session对象的区别
session cookie
保存位置 服务器 客户端
安全性 安全 不安全
保存的内容 Object String
过滤器
概念
在请求到达服务器资源之前(Servlet/jsp)之前,过滤器可以拦截某些请求
在过滤器中皆可以添加一些相应的代码处理,可以减少代码冗余
Filter接口
filter接口是过滤器类必须实现的接口,该接口有三个方法
init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次.参数filterConfig可以获得filter的初始化参数.
doFilter(ServletRequest request, ServletResponse response, FilterChain chain):该方法是对filter进行过滤操作的方法,是最重要的方法.
过滤器必须实现的方法.方法体中可以对request和response进行预处理.其中FiterChain可以将处理后的request和response对象传递到过滤链上的下一个资源
destory():该方法在容器销毁前被调用
应用场景
自动登录
统一设置编码格式
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// System.out.println("dofilter");
System.out.println("编码设置");
servletRequest.setCharacterEncoding(encod);//执行统一的编码设置
filterChain.doFilter(servletRequest,servletResponse);//请求向下继续进行,到达过滤器链上的下一个资源
}
xml文件配置filter
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.lsy.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encod</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern><!--全部文件进行过滤-->
</filter-mapping>
监听器
servlet监听器是servlet规范中的一种特殊的类,用于监听servletContext,HTTPSession和ServletRequest等域对象的创建和销毁事件,
以及监听这些域对象中属性发生修改的事件
分类
按监听对象分类
- 用于监听应用程序对象(ServeletContext)
- 用于监听用户会话对象(HttpSession)
- 用于监听请求消息对象(ServletrRequest)
ServletContext和HttPSession
package com.lsy.login.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class ObjectListener implements ServletContextListener, HttpSessionListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("servletContext创建");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("servletContext销毁");
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session对象创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session对象销毁");
}
}