JavaWeb-servlet、cookie和session
一、Servlet技术1.什么是Servlet(1)、Servlet 是JavaEE规范之一。 规范就是接口(2)、Servlet 就JavaWeb三大组件之一。 三大组件分别是: Servlet 程序、Filter 过滤器、Listener 监听器。(3)、Servlet 是运行在服务器上的一个java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。2.手动实现Servlet程序(
笔记整理来源于尚硅谷,仅供本人复习使用,无其它目的
一、Servlet技术
1.什么是Servlet
2.手动实现Servlet程序
(1)、编写一个类去实现Servlet接口
(2)、实现service方法,处理请求,并响应数据
package JavaWeb;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class HelloServlet implements Servlet {
//service方法是专门用来处理请求和响应的
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.Service方法:servlet被访问了");
//强制转换为子类HttpServletRequest类型,因为只有子类才有.geiMethod()方法
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//子类调用.geiMethod()方法,获取请求方式
String method = httpServletRequest.getMethod();
//判断
if ("GET".equals(method)){
doGet();
}else if ("POST".equals(method)){
doPost();
}
}
//做GET请求的操作
public void doGet(){
System.out.println("请求方式为GET请求!!");
System.out.println("请求方式为GET请求!!");
System.out.println("请求方式为GET请求!!");
}
//做POST请求的操作
public void doPost(){
System.out.println("请求方式为POST请求!!");
System.out.println("请求方式为POST请求!!");
System.out.println("请求方式为POST请求!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4.destroy销毁方法");
}
}
(3)、到web.xml中去配置servlet程序的访问地址
<!--第一个servlet程序-->
<!-- 1.servlet标签给Tomcat(服务器)配置Servlet程序 -->
<servlet>
<!-- servlet-name标签 Servlet程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class是Servlet程序的全类名-->
<servlet-class>JavaWeb.HelloServlet</servlet-class>
</servlet>
<!-- 2.servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!-- servlet-name标签的作用是告诉服务器,我当前配置的地址是给哪个Servlet程序使用 -->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern配置访问地址<br/>
/ 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径(/0706_servlet) <br/>
/hello 表示地址为http://ip:port/工程路径/hello <br/>
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.URL 定位到 servlet 程序去访问
4.Servlet的生命周期
(1)、执行Servlet构造器方法
public HelloServlet() {
System.out.println("1.构造器方法");
}
(2)、执行init初始化方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2.init初始化方法");
}
注意:第(1)、(2)步,是在第一次访问的时候创建Servlet程序会调用。
(3)、执行service方法
//service方法是专门用来处理请求和响应的
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3.Service方法:学习JavaWeb的第一天!!");
}
注意:第(3)步,每次访问都会调用。
(4)、执行destroy销毁方法
@Override
public void destroy() {
System.out.println("4.destroy销毁方法");
}
注意:第(4)步:在 web 工程停止时候调用。
5.通过继承HttpServlet实现Servlet程序
一般在实际项目开发中, 都是使用继承HttpServlet类的方式去实现Servlet程序。
(1)、编写一个类去继承HttpServlet 类
(2)、根据业务需要重写doGet或doPost 方法
public class HelloServlet2 extends HttpServlet {
//重写init方法
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);//必须加上这句,否则无法进入hello2页面,会报404错误,子类重写了父类的init方法,则调用时父类的init方法就会丢失,为了避免丢失则添加super
System.out.println("重写init方法");
}
//get请求调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2的doGet方法!!");
ServletConfig servletConfig = getServletConfig();
System.out.println("获取初始化参数userName的值:"+servletConfig.getInitParameter("userName"));
System.out.println("获取初始化参数url的值:"+servletConfig.getInitParameter("url"));
}
//post请求调用
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet2的doPost方法!!");
}
}
(3)、到web.xml中的配置Servlet程序的访问地址
<!--第二个servlet程序-->
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>JavaWeb.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet2</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
6.idea创建servlet程序
idea会自动在xml配置文件中创建servlet程序以及在对应的包创建类
7.Servlet 类,继承体系
二、ServletConfig类
1.ServletConfig类介绍
2.ServletConfig类的三大作用
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2.init初始化方法");
//1.可以获取Servlet程序的别名servlet -namp的值
System.out.println("获得HelloServlet程序的别名是:" + servletConfig.getServletName());
//2.获取初始化参数init-param.
System.out.println("获取初始化参数userName的值:"+servletConfig.getInitParameter("userName"));
System.out.println("获取初始化参数url的值:"+servletConfig.getInitParameter("url"));
//3.获取ServletContext对象
System.out.println("获取ServletContext对象:"+servletConfig.getServletContext());
}
@Override
public ServletConfig getServletConfig() {
return null;
}
<!--第一个servlet程序-->
<!-- servlet标签给Tomcat(服务器)配置Servlet程序 -->
<servlet>
<!-- servlet-name标签 Servlet程序起一个别名(一般是类名) -->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class是Servlet程序的全类名-->
<servlet-class>JavaWeb.HelloServlet</servlet-class>
<!--init-param 是初始化参数(键值对),只能servletConfig对象获取-->
<!--第一个参数-->
<init-param>
<!-- param-name是参数名-->
<param-name>userName</param-name>
<!-- param-value是参数值 -->
<param-value>root</param-value>
</init-param>
<!-- 第二个参数-->
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<!-- servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!-- servlet-name标签的作用是告诉服务器,我当前配置的地址是给哪个Servlet程序使用 -->
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern配置访问地址<br/>
/ 斜杠在服务器解析的时候,表示地址为http://ip:port/工程路径(/0706_servlet) <br/>
/hello 表示地址为http://ip:port/工程路径/hello <br/>
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
三、ServletContext类
1.什么是 ServletContext ?
2.什么是域对象?
(1)域对象,是可以 像Map一样,存取数据的对象,叫做域对象。
(2)这里的域对象 指的是,存取的数据的操作范围
(3)数据存取
3.ServletContext 常见的 4 个作用
servlet程序的xml配置
<!--第四个servlet程序-->
<servlet>
<servlet-name>ContextServlet</servlet-name>
<servlet-class>JavaWeb.ContextServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContextServlet</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
测试代码
public class ContextServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1,获取web.xmL中配置的上下文参数context-param
ServletContext context = getServletConfig().getServletContext();
System.out.println("上下文参数context-param参数gougege的值是:"+ context.getInitParameter("gougege"));
System.out.println("上下文参数context-param参数gou的值是:"+ context.getInitParameter("gou"));
//2,获取当前的工程路径,格式: /工程路径
System.out.println("当前工程路径:"+context.getContextPath());
//3,获取工程部署后在服务器硬盘上的绝对路径
/*
/ 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录<br/>
*/
System.out.println("工程部署后在服务器硬盘上的绝对路径"+context.getRealPath("/"));
}
}
四、Http协议
1.什么是HTTP协议
(1)什么是协议?
协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。
(2)HTTP协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议。
(3)HTTP协议中的数据又叫报文。
2.请求的HTTP协议格式
(1) 客户端给服务器发送数据叫请求。
(2) GET请求
(3)POST请求
(4)常用请求头的说明
(5) 哪些是GET请求,哪些是POST请求
3.响应的HTTP协议格式
(1) 服务器给客户端回传数据叫响应。
(2) 常用的响应码说明
五、HttpServletRequest类
1.HttpServletRequest类的作用
每次只要有请求进入Tomcat 服务器,Tomcat 服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法( doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。
2.HttpServletRequest类的常用方法
测试代码
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//①getRequestURI() 获取请求的资源路径
System.out.println("URI->:"+req.getRequestURI());
//②getRequestURL() 获取请求的统一-资源定位符(绝对路径)
System.out.println("URL->:"+req.getRequestURL());
//③getRemoteHost() 获取客户端的ip地址
System.out.println("ip->:"+req.getRemoteHost());
//④getHeader() 获取请求头:如浏览器信息UserUser-Agent
System.out.println("请求头User-Agent->:"+req.getHeader("User-Agent"));
//⑤getMethod() 获取请求的方式GET或POST
System.out.println("请求方式->:"+req.getMethod());
}
}
测试结果
3.获取请求的参数值
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
System.out.println("--------post请求---------");
//获取用户名
String username = req.getParameter("username");
System.out.println("用户名:"+username);
//获取密码
String password = req.getParameter("password");
System.out.println("密码:"+password);
//获取兴趣爱好
String[] hobby = req.getParameterValues("hobby");
System.out.println("兴趣爱好:"+ Arrays.asList(hobby));
}
注意:解决post请求的乱码: req.setCharacterEncoding("UTF-8");
4.请求转发
柜台一
public class Servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数(办事的材料)
System.out.println("Servlet1(柜台一)查看参数(材料):" + req.getParameter("username"));
//给servlet1盖章,带到servlet2查看(共享)
req.setAttribute("key", "柜台一(servlet1)的章");
//问路去哪:柜台二怎么走(获得请求地址)
/*
请求转发必须要以斜杠打头,/斜杠表示地址为: http://ip:port/工程名/,映射到IDEA代码的web目录<br/>
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//跳转(重定向)到servlet2(柜台二)
requestDispatcher.forward(req, resp);
}
}
柜台二
public class Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求的参数(办事的材料)
System.out.println("Servlet2(柜台二)查看参数(材料):"+request.getParameter("username"));
//查看servlet1盖的章(共享)
System.out.println("柜台一是否有章:"+request.getAttribute("key"));
//处理业务
System.out.println("servlet2(柜台二)处理自己的业务!!!");
}
}
例如访问如下ip
5.base标签
base 标签,可以设置当前页面中,所有相对路径工作时,参照哪个路径进行跳转
六、HttpServletResponse类
1.HttpServletResponse类的作用
2.字节流和字符流
(4)响应乱码
//修改了服务器的字符集
resp.setCharacterEncoding("UTF-8");
//同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
resp.setContentType("text/html;charset=UTF-8");
//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html;charset=UTF-8");
3.请求重定向
(1)第一种方式
//设置响应状态码为302,表示重定向
resp.setStatus(302);
//设置响应头,设置新的的地址
resp.setHeader("Location","http://localhost:8080/0713_Response/response2");
(2)第二种方式
resp.sendRedirect("http://localhost:8080/0713_Response/response2");
访问网址:http://localhost:8080/0713_Response/response1
会跳转到 : http://localhost:8080/0713_Response/response2
七、Cookie
1.什么是Cookie?
(1).Cookie是服务器通知喜户端保存键值对的一种技术.
(2).客户端有了Cooke后,每次请求都发送给服务器。
(3).每个Cookie的大小不能超过4kb
(4).Cookie是服务器中Servlet程序创建并通过response返回给客户端浏览的的键值对信息。
2.Cookie的创建
(1) 创建Cookie对象
Cookie cookie = new Cookie("key", "value");
(2) 通知客户端保存Cookie
response.addCookie(cookie);
第一次访问没有cookie
下一次访问有cookie
3.Cookie值的修改
(1)第一种方式
(2)第二种方式
注意:对于Version 0 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引景、斜杠、问号、at符号、冒号和分号。空值在所有浏览器上的行为不一定相同。
4.查找指定的cookie
5.Cookie生命控制
6.Cookie有效路径Path的设置
(1)Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发
(2)path属性是通过请求的地址来进行有效的过滤。
eg:
CookieA 的 path=/工程路径
CookieB 的 path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html
CookieA发送
CookieB不发送
http://ip:port/工程路径/abc/a.html
CookieA发送
CookieB发送
7.免用户名登陆
八、Session会话
1.什么是Session?
(1)Session就是一个接口HttpSession。
(2)在web中Session就一会话,维护一个客户端和服务器之间关联的一种技术。
(3)每个客户端都有自己的Session会话,用来保存用户登陆之后的信息。
2.Session和Cookie有什么区别?
Cookie是保存在客户端的,Session是保存在服务器端的
3.如何创建Session和获取(id号,是否为新)
(1)Session的创建与获取
Session的获取和创建的API是一样的
request.getSession():
第一次调用是创建Session会话,之后调用都是获取创建好的Session会话对象。
isNew():
判断到底是不是刚创建出来的(新的)
true表示刚创建
false表示获取之前创建
每个会话都有一个身份证号,ID值(唯一),可以通过getId()获取Session的id值
4.获取session域中数据内容
//设置域数据
request.getSession().setAttribute("key1", "value1");
//获取域数据
request.getSession().setAttribute("key1", "value1");
5.Session生命周期控制
(1)设置Session的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
public void setMaxlnactielnterval(int interal)
值为,正数的时候,设定Session的超时时长。
负数表示永不超时( 极少使用)
(2)获取Session的超时时间
public int getMaxInactivelnteral()
(3)当前Session默认的超时时长是多少!
public void invalidate()
Session默认的超时时间长为30分钟。
因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为: 30 分钟。
<session-config>
<session-timeout> 30</session-timeout>
</session-config>
(4)web.xml配置文件中修改web工程所有seession的默认超时时长
(5)session的超时指的是,客户端两次请求的最大间隔时长。
(6)Session马上销毁
6.浏览器和Session之间关联的技术内幕
总结:Session技术,底层其实是基于Cookie技术来实现的。客户端在没有Cookie的情况下访问服务器,服务器创建session,并将session存储进内存,同时将sessionId信息通过cookie发送给浏览器,浏览器收到cookies后,当携带当前cookie信息再次访问服务器时,服务器就会从内存中取出对应的session数据。
更多推荐
所有评论(0)