一、servletConfig部分
作用:
ServletConfig 对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来获取web.xml中的配置信息
使用:
获取ServletConfig对象
获取web.xml中的Servlet的配置信息
二、servletContext部分
package com.hpu.cn;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class servletContext extends HttpServlet {
/* ServletContext学习:
* 问题:
* 不同的用户使用相同的数据
* 解决:
* ServletContext对象
* 特点:
* 服务器创建
* 用户共享
* 作用域:
* 整个项目以内
* 生命周期:
* 服务器启动到关闭
* 使用:
* //获取ServletContext对象
//第一种方式
ServletContext sc=this.getServletContext();
//第二种方式
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式
ServletContext sc3=req.getSession().getServletContext();
* 使用ServletContext对象完成数据共享
* //数据存储
* sc.setAttribute(String key, Object value);
* //数据共享
* sc.getAttribute("str")返回为Object类型
* 注意:
* 不同的用户可以给ServletContext数据存储
* 获取的数据不存在则返回null
* 获取项目中的web.xml的配置信息
* sc.getInitParameter(String name);根据键的名称获取在web.xml中全局数据的值,返回String类型
* 如果不存在返回null
* sc.getInitParameterNames(); 返回键名称的枚举
* 配置方式:注意一组<context-param>标签只能存储一组键值对数据,多组声明多个标签
* <context-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</context-param>
作用:将静态数据与代码解耦
//获取项目webroot下的资源的绝对路径
String path=sc.getRealPath("/doc/1.txt");
获取的路径为项目根目录。参数为项目根目录中的路径
//获取webroot下的资源的流对象
InputStream resourceAsStream = sc.getResourceAsStream("/doc/1.txt");
参数为项目根目录中的路径
注意:
此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类的加载器获取
* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletContext对象
//第一种方式
ServletContext sc=this.getServletContext();
//第二种方式
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式
ServletContext sc3=req.getSession().getServletContext();
//使用ServletContext对象完成数据共享
//数据存储
sc.setAttribute("str", "servletcontext学习");
//获取项目中web.xml的全局配置数据
String name = sc.getInitParameter("name");
System.out.println(name);
//获取项目根目录下的资源的绝对路径
String path=sc.getRealPath("/doc/1.txt");
System.out.println(path);
//获取项目根目录下资源的流对象
InputStream resourceAsStream = sc.getResourceAsStream("/doc/1.txt");
}
}
三、session部分
package com.hpu.Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionServlet extends HttpServlet {
/* (non-Javadoc)
* 一个用户的不同请求处理,数据共享怎么办
* 解决:使用Session
* 特点:
* 存储在服务器
* 服务器进行创建
* 依赖Cookie技术
* 一次会话
* 默认存储时间30分钟
* 作用:
* 解决了一个用户不同请求处理数据共享的问题
* 使用:创建Session对象/获取session对象
* HttpSession hs=req.getSession();
*
* 如果请求中拥有session标识符也就是JSESSIONID,则返回其对应的session对象
* 如果请求中没有session的标识符也就是JSEESIONID,则创建新的session对象,并将其JSESSIONID作为Cookie数据存储到浏览器运存中
* 如果session对象失效了,也会创建一个session对象,则......
* //设置session存储时间
* hs.setMaxInactiveInterval(int seconds);
* // 在指定的时间内session对象没有使用则被销毁,如果使用重新计时
* //设置强制失效
* hs.invalidate();
* 存储:hs.setAttribute(String key, Object value);
* 获取:hs.getAttribute(String name);
* 注意:
* 存储的动作和取出的动作发生在不同请求中,但是存储要先于取出执行
* 使用场景:
* 一般用户在登陆web项目时候 会将个人信息存储到Session中,供该用户的其他请求使用
* 总结:
* session解决了一个用户的不同请求数据共享问题,只要JSESSIONID和Session对象失效的情况下,用户的任意请求都能获取到同一个session
* 作用域:
* 一次会话
* 在JSESSIONID不失效和Session不失效,作用域是整个项目
* session失效处理:
* 将用户请求中的JSESSIONID和后台获取的session对象的JSESSIONID进行对比
* 如果一致,则session没有失效,如果不一致则证明session失效。重定向登陆页面,让用户登录
* 注意:JSESSIONID存储在Cookie的临时存储空间中,浏览器关闭即失效
* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置相应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//创建session对象
HttpSession hs=req.getSession();
//设置session时间
//hs.setMaxInactiveInterval(5);
//设置强制失效
//hs.invalidate();
hs.setAttribute("key", "namessss");
System.out.println(hs.getId());
//处理请求信息
resp.getWriter().write("Session学习");
}
}
四、请求转发
req.getRequestDispatcher(“要转发的地址”).forward(req, resp);
转发地址:相对路径,直接书写servlet的别名即可
特点:一次请求,浏览器地址栏信息不变,
注意;请求转发后直接return
五、重定向
问题:使用请求转发,造成表单数据重复提交
解决: 使用重定向
使用:
resp.sendRedirect("路径");
本地路径为;uri
网络路径为:定向资源的URL信息
特点:
两次请求,浏览器地址栏信息改变,两个request对象
request作用域:
解决了一次请求内的servlet共享的问题
重定向:
解决了表单重复提交的问题,以及当前servlet无法处理的请求问题
使用场景:
如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
如果请求被Servlet接收后,无法进行处理,建议使用重定向到可以处理的
六、Cookie部分
package com.hpu.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class cookieServlet extends HttpServlet {
/* Cookie学习
* 作用:解决了发送不同请求的数据共享问题
* 使用:
* //创建cookie对象
* Cookie c =new Cookie(key, value);
* //设置有效期
* c.setMaxAge(int seconds);
* //设置有效路径
* c.setPath(String uri);
* //响应cookie给客户端
* resp.addCookie(c);
* //Cookie获取
* //获取Cokkie数据
* Cookie[] cookies=req.getCookies();
* //遍历数组获取Cookie信息
* 使用for循环遍历即可
* for(Cookie c:cookies){
String name=c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
*
* 注意:
* 一个cookie只能存储一条数据,多条数据,可以创建几个Cookie存储
* 特点:
* 浏览器端的数据存储技术
* 存储的数据声明在服务器端
* 临时存储:存储在浏览器的运行内存中
* 定时存储:设置了Cookie的有效期,存储在客户端的硬盘里,在有效期内符合路径的要求的请求都会附带该信息
* 默认Cookie信息存储好之后,每次请求都会附带信息。除非设置有效路径
* @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求结果
//处理请求结果
//使用cookie进行浏览器端的数据存储
//创建cookie对象
Cookie c1 =new Cookie("mouse", "thinkpad");
Cookie c2 =new Cookie("key", "hpu");
//设置cookie
c2.setMaxAge(3*24*3600);
//设置有效路径
c2.setPath("/cookie/abc");
//响应cookie信息
resp.addCookie(c1);
resp.addCookie(c2);
//直接响应
resp.getWriter().write("Cookie学习");
}
}
七、JSP语法部分
1、Jsp的三种注释
前端语言注释
会被转译,也会被发送,但是不会被浏览器执行
java语言注释
会被转译,但是不会被servlet执行
Jsp注释
不会被转译
2、Jsp的page指令(多个属性之间用空格隔开):
<%@page 属性名="属性值" 属性名="属性值" 属性名="属性值"...%>
language:声明要被转移的语言
import :声明转译的java文件要导入的包,不同包之间用逗号隔开
pageEncoding:设置jsp文件的数据编码格式
contentType:设置jsp数据响应给浏览器时解析编码格式
session:设置要转译的servlet中是否开启session支持,默认开启,属性值为boolean类型
errorPage:设置jsp运行错误跳转的页面
extends:设置jsp转译的java文件要继承的父类(包名+类名)
作用:
配置文件转译相关参数
3、 jsp局部代码块
特点:
局部代码块中声明java代码会被原样转译到jsp对应的servlet文件的_JspService方法中
代码块中声明的变量都是局部变量
使用:<% %>
缺点:书写麻烦,阅读困难
开发:
使用servlet进行逻辑处理,使用jsp进行页面展示
4、 jsp的全局代码块
特点:
声明的java 代码作为全局代码转译到对应的servlet中
使用:<%! %>
注意:
全局代码块中声明的代码,需要使用局部代码块调用
5、 jsp的脚本段语句
特点:帮助我们快速获取变量或者方法的返回值作为数据响应给浏览器
使用:<%=变量名或者方法%>
注意:不要在 变量名或者方法名后使用分号
使用位置:除jsp语法要求以外的任何位置。
6、 Jsp静态引入和动态引入
静态引入:
<%@include file="要引入的jsp的相对路径" %>
特点:
会将引入的jsp文件和当前jsp文件转译成一个java文件使用。
在网页中也就显示合并后的显示效果
注意:
静态引入的jsp文件不会转译java(servlet)文件
当前文件和静态引入的jsp文件,不能够使用java代码块声明同名变量
动态引入:
<jsp:include page="要引入的jsp的相对路径"></jsp:include>
特点:
会将引入的jsp文件单独转译,在当前文件转好的Java文件中调用引入的jsp文件的转译文件
在网页中显示合并后的效果
注意:
动态引入允许文件中声明同名变量
优点:
减少代码冗余
7、 jsp的转发标签 forward:
使用:
<jsp:forward page="要引入的jsp的相对路径"></jsp:forward>
特点:
一次请求
地址栏url不变
注意:
在转发标签的两个标签中间除了写<jsp:param value="str" name="aaa"/>子标签不会报错,name为key,value为value
其他任意字符都会报错
8、 jsp的九大内置对象:
内置对象:
jsp文件在转译对应的servlet文件的时候自动生成的并声明的对象。我们jsp页面可以直接使用
注意:
内置对象在jsp页面中通过使用,使用局部代码块或者脚本语句来使用,不能在全局在全局代码块中使用
内容:
pageContext:页面上下文对象,封存了其他内置对象。封存了jsp运行信息
注意:每个jsp文件单独拥有一个pageContext对象
作用域:当前页面
request:封存当前请求数据的对象。由tomcat服务器创建,一次请求
session:此对象用来存储用户的不同请求的共享数据,一次会话
application:也就是ServletContext对象,一个项目只有一个。存储用户共享数据的对象,以及完成其他操作。项目内
response:响应对象,用来响应请求处理结果给浏览器对象。设置响应头,重定向。
out:响应对象,Jsp内部使用,带有缓冲区的响应对象,效率高于response对象
page:代表当前Jsp的对象,相当于Java中的this
exception:异常对象,存储当前运行的异常信息
注意:使用此对象需要在page指定中使用属性isErrorPage="true"开启。
config:也就是servletConfig,主要用来获取web.xml中的配置数据,完成初始化对象的读取
9、 四个作用域对象:
pageContext:当前页面,解决了当前页面内的数据共享。获取其他内置对象
request: 一次请求。一次请求的servlet的数据共享。通过请求转发流转给下一个servlet
session:一次会话。一个用户的不同请求的数据共享。将数据从一次请求流转给其他请求
application:项目内,不同用户数据共享问题 。将数据流转流转给其他用户。
作用:
数据流转
10、jsp文件路径:
在jsp中的资源路径可以使用相对路径,完成跳转,但是:
问题一:资源的位置不可以随意更改
问题二:需要使用../进行文件夹的跳转,但是比较麻烦
使用绝对路径:
/虚拟项目名/项目资源路径
例如<a href="/jspDemo/a/a.jsp"></a>
注意:
在jsp中资源的第一个/表示服务器的根目录,相当于:localhost:8080
使用jsp全局路径声明:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href="<%=basePath%>">
作用:
给资源前面加项目名称。http://127.0.0.1:8888/虚拟项目名/