Java web基础(一)

servlet/jsp/request/response/cookie/session/pageContext/EL表达式/JSTL标签库

Servlet

生命周期

实例化(构造函数)->初始化(init)->服务(service)->销毁(destroy)

三种创建方式

  1. 实现Servlet接口
  2. 继承GenericServlet类(适配器模式)
  3. 继承HttpServlet类(常用、模板方法设计模式)

映射细节

1
2
3
4
<servlet-mapping>
<servlet-name>Demo</servlet-name>
<url-pattern>/Demo</url-pattern>
</servlet-mapping>

servlet-mapping中的url-pattern添加映射

1
2
3
4
5
6
url-pattern:
* 代表任意字符串
*.do 以*.字符串的请求都可以访问 注:不要加/
/* 任意字符串都可以访问
/action/* 以/action开头的请求都可以访问
/ 表示执行默认映射,所有资源都是servlet

匹配规则: 绝对匹配 -> /开头匹配 -> 扩展名方式匹配(优先级:从高到低)

ServletConfig – 获取配置信息

web.xml中使用如下格式,通过ServletConfig获取这些数据

1
2
3
4
<init-param>
<param-name>data</param-name>
<param-value>1234</param-value>
</init-param>

常用获取方式

  1. this.getServletConfig().getInitParameter(“data”);
  2. this.getInitParameter(“data”);

ServletConfig也可以获得ServletContext对象

ServletContext – 代表的是整个应用,单例

作用: 域对象、在一定范围内(当前应用),使多个Servlet共享数据

常用方法

1
2
3
void setAttribute(String name,object value);//向ServletContext对象的map中添加数据
Object getAttribute(String name);//从ServletContext对象的map中取数据
void removeAttribute(String name);//根据name去移除数据

获取全局配置信息

  1. String getInitParameter(String name) //根据配置文件中的key得到value
    1
    2
    3
    4
    5
    <!-- web.xml中为整个web应用配置共享参数 -->
    <context-param>
    <param-name>name</param-name>
    <param-value>value</param-value>
    </context-param>

获取资源路径

  1. String getRealPath(String path);//根据资源名称得到资源的绝对路径(当前应用任何位置的任何资源)

实现Servlet的转发

  1. this.getServletContext.getRequestDispatcher(String path).forward(request,response);

HttpServletResponse

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象

响应行

  1. setStatus(int sc) //设置响应状态码

响应头

  1. sendRedirect(String location) //请求重定向
  2. setHeader(String name, String value) //设置响应头信息
    1
    2
    3
    4
    5
    6
    7
    //告知浏览器使用什么码表
    response.setHeader("content-type", "text/html;charset=UTF-8");
    //告知客户端不缓存
    response.setHeader("pragma", "no-cache");
    response.setHeader("cache-control", "no-cache");
    response.setDateHeader("expires", 0);

响应正文

  1. getWrite(); //字符输出流
  2. getOutputStream(); //字节输出流
  3. setCharacterEncoding(String charset); //告知服务器使用什么编码
  4. setContentType(String type); //设置ContentType

HttpServletRequest

请求行

  1. getMethod(); //获得请求方式
  2. getRequestURL(); //返回客户端发出请求时的完整URL
  3. getRequestURI(); //返回请求行中的资源名部分
  4. getContextPath(); //当前应用的虚拟目录

请求消息头

1
2
3
String getHeader(String name); //根据头名称得到头信息值
Enumeration getHeaderNames(); //得到所有头信息name
Enumeration getHeaders(String name); //根据头名称得到相同名称头信息值

请求正文

与获取表单数据相关的方法

  1. getParameter(name); //根据表单中name属性的名,获取value属性的值方法
  2. getParameterValues(String name); //专业为复选框取取提供的方法
  3. getParameterNames(); //得到表单提交的所有name的方法
  4. getParameterMap(); //到表单提交的所有值的方法
  5. getInputStream(); //以字节流的方式得到所有表单数据

与操作非表单数据相关的方法(request也是一个域对象)

  1. setAttribute(String name, Object value);
  2. getAttribute(String name);
  3. removeAttribute(String name);

与请求转发相关的方法

  1. RequestDispatcher getRequestDispatcher(String path); //请求转发或请求包含的协助对象
  2. getRequestDispatcher(path).forward(request,response); //请求转发
  3. getRequestDispatcher(path).include(request,response); //请求包含

与请求编码相关的方法

  1. request.setCharacterEncoding(“UTF-8”); //解决post方式编码
  2. String name = new String(name.getBytes(“iso-8859-1”),”UTF-8”);//解决get方式编码,所有属性都要设置一遍

转发与重定向的区别
   转发:request、服务器执行、客户端只发送一次请求、地址栏不变、能够传递数据、为域对象
   重定向:response、客户端执行、客户端发送两次请求、地址栏发生变化、不能传递数据、可跳转到其它应用

Cookie

由于Cookie数据是由客户端来保存和携带的,所以称之为客户端技术

Cookie是servlet发送到web浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器
Cookie的值可以唯一的标识客户端,因此,Cookie常用于会话管理

属性

  1. name: 名称不能唯一确定一个Cookie,路径可能不同
  2. value: 不能存中文
  3. path: 默认值是写Cookie的那个程序的访问路径
  4. maxAge: cookie的缓存时间,默认是-1(默认存在浏览器的内存中),单位为秒
         -负数: cookie的数据存在浏览器缓存中
         -0: 删除Cookie
         -正数: 缓存(持久化到磁盘上)的时间

常用方法:

  1. Cookie(String name, String value); //构造函数创建Cookie
  2. setPath(); //指定客户端应该返回cookie的路径
  3. setMaxAge(0); //设置cookie的最大生存时间,以秒为单位,为0相当于删除cookie

    添加与获取Cookie

  4. response.addCookie(cookie); //添加Cookie
  5. request.getCookies(); //获取Cookie

HttpSession

域对象,同一个会话下,可以使一个应用的多个资源共享数据
 
cookie为客户端技术,只能存字符串
session为服务器端的技术,可以存对象  

常用方法

  1. void setAttribute(String name,Object value);
  2. Object getAttribute(String name);
  3. void removeAttribute(String name);
  4. HttpSession.getId(); //获取Cookie的ID
  5. setMaxInactiveInterval(int interval); //设置session的存活时间
  6. invalidate(); //使此会话无效

获取Seesion

  1. request.getSession();
getSession内部执行原理:
1、获取名称为JSESSIONID的cookie的值
2、若没有这样的cookie,创建一个新的HttpSession对象,分配一个唯一的SessionID,
 并且向客户端写一个名字为JSESSIONID=sessionID的cookie
3、若有这样的Cookie,则获取cookie的值(即HttpSession对象的值),
   从服务器的内存中根据ID找那个HttpSession对象,若找到这个对象,则取出Session,否则,返回2

客户端禁用Cookie后的会话数据保存问题

禁用Cookie,则浏览器不会向服务器发送cookie的请求消息头

解决方案

  1. 在主页上给出不要禁用cookie提示
  2. URL重写,必须对网站的所有地址都重写
1
2
3
4
具体重写实现
http://url--->http://url;JSESSIONID=111
response.encodeURL(String url);
request.getSession();

Session的状态

创建 – 当浏览器第一次访问服务器时,动态创建
存活 – 服务器正常运行
销毁 –
  4种情况:
    1. 自然销毁
    2. Session.invalidate();强制销毁
    3. 超时默认销毁(默认30min)
    4. web.xml文件中servlet-config设置servlet-timeout //Session有效时间、单位min
持久化:
  1. 存盘
  2. 内存中的一个全景图
  3. IO实现serializable

//内存溢出、服务器重启 -> 钝化-搁置/活化-激活

Jsp

Java Server Pages、Jsp实际上就是Servlet

原理

翻译(翻译为java文件、就是servlet) -> 编译(编译为class文件) -> 执行

实践

Servlet: 控制器、重点编写java代码逻辑(获取表单数据、处理业务逻辑、分发转向)
Jsp: 代码显示模板、重点在于显示数据

基本语法

  1. <% java代码 %> //脚本
  2. <%=2+3 %> //等价于 out.print(2+3);
  3. <%! %> //声明、表示在类中定义全局成员和静态块
  4. <%– 被注释的内容 –%> //与html注释相比较,安全、省流量

    指令

    Jsp指令是为Jsp引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分
  5. page指令:用于定义JSP页面的各种属性

    1
    <%@ page import="java.util.*" %>
  6. Include指令:
      静态包含:把其它资源包含到当前页面中,在翻译时就把两个文件合并,优先使用

    1
    <%@ include file="/include/header.jsp" %>

  动态包含:不会合并文件,当代码执行到include时,才包含另一个文件的内容

1
<jsp:include page="/include/header.jsp"></jsp:include>

  1. taglib指令:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段
    1
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

动作

<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值

内置对象

指在Jsp的<%=%> 和<% %>中可以直接使用的对象
request、session、application、pageContext、out、config、response、page、exception

PageContext

域对象、可以操作其它三个域对象(request session application)的数据
在普通类中可以通过PageContext获取其他JSP隐式对象,自定义标签时就使用
提供了的简易方法

  1. pageContext.forward(“2.jsp”);
  2. pageContext.include(“2.jsp”);

方法

1
2
3
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);

操作其它域对象的方法

1
2
3
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);

scpoe的值

1
2
3
4
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE

自动从page request session application依次查找,找到了就取值,结束查找

1
findAttribute(String name);

四大域对象实际使用

PageContext: pageConext 存放的数据在当前页面有效,开发时使用较少。
ServletRequest: request  存放的数据在一次请求(转发)内有效,使用非常多
HttpSession: session 存放的数据在一次会话中有效,使用的比较多,如:存放用户的登录信息,购物车功能等
ServletContext: application 存放的数据在整个应用范围内都有效,因为范围太大,应尽量少用

EL表达式

用于简化jsp中java代码,不是一种开发语言,是jsp中获取数据的一种规范

获取数据

只能获取存在4个作用域中的数据,获取对于null这样的数据,在页面中表现为空字符串

  1. ${u} -> pageContext.findAttribute(“u”);
  2. ${param.name} -> url?name=tom
  3. ${u.name} -> u.getName();

    运算

  4. empty: 判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
  5. 三元运算符 如: ${ empty list ? “为true” : “为false”}

    隐式对象

    pageContext、pageScope、requestScope、sessionScope、applicationScope、cookie
    param、paramValues、header、headerValues、initParam

JSTL

JSTL (JavaServerPages Standard Tag Library) JSP标准标签库
实现JSP页面中逻辑处理,如判断、循环等

使用

在JSP页面添加taglib指令

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

使用JSTL标签

1
<c:if test:""></c:if>

常用标签(核心标签库)

  1. 通用标签: set、 out、 remove(变量设置、输出、移除)
  2. 条件标签:if choose 相当于if、switch(choose子标签when、otherwise相当于switch里的case、defalut)
  3. 迭带标签:foreach: 普通循环、迭代