什么是Servlet:Servlet 是 Server 与 Applet 的缩写,是服务端小程序的意思。(言外之意:要实现 web 开
发,需要实现 Servlet 标准),Servlet 本质上也是 Java 类(言外之意:写自己的类,不用写 main 方法,别人自动
调用)
1、Servlet基本内容
- ⭐首先需要导入依赖
javax.servlet
javax.servlet-api
3.1.0
provided
- ⭐创建Servlet的三种方式
①、继承HttpServlet(推荐)
②、继承抽象类GenericServlet
③、实现接口Servlet
- ⭐Http协议
①、特点:请求响应式,无状态链接
②、请求方式:请求地址,协议,版本号,请求头
③、响应格式:http协议,状态码,响应头
④、url(统一资源定位符)和uri(统一资源定位标志)url包括uri
- ⭐Servlet配置
①、创建Servlet对象属于单例模式中的单例模式
②、配置分为两种方式:一种是注解,一种是配置pom.xml文件
2、Servlet的登录练习
- 准备登录页面,form.jsp和登录成功页面success.jsp和登录失败页面faile.jsp(默认用户名和密码为lkb abc)
Servlet.Java文件内容》》》
package com.yjxxt.demo01;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/form01")
public class Servlet03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("utf-8");
res.setContentType("text/html;charset:utf-8");
//获取请求
String uname=req.getParameter("uname");
//获取密码
String psd=req.getParameter("psd");
req.setAttribute("psd",psd);
//获取爱好
String[] hobby=req.getParameterValues("hobby");
req.setAttribute("hobby",hobby);
for (String str: hobby) {
System.out.println("爱好:"+str);
}
//返回响应
//res.getWriter().println(name);
System.out.println(uname +"----------------->"+psd);
if("lkb".equals(uname)&&"abc".equals(psd)){
req.setAttribute("uname",uname);
req.getRequestDispatcher("success.jsp").forward(req,res);
return;
}else{
req.getRequestDispatcher("faile.jsp").forward(req,res);
}
}
}
登录界面form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Demo01
成功和失败页面编写
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
登录
欢迎${uname }会员~
<%----------------------失败--------------------%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录
登录失败~
运行结果:》》
3、转发和重定向的比较
- 转发:getRequestDispatcher(目标).forwartd(req,resp)服务器一次
- 重定向:sendRedirect(目标)客户端两次访问
此处用上面的登录案例演示稍作修改如下》
@WebServlet("/form01")
public class Servlet03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("utf-8");
res.setContentType("text/html;charset:utf-8");
//获取请求
String uname=req.getParameter("uname");
//获取密码
String psd=req.getParameter("psd");
req.setAttribute("psd",psd);
//获取爱好
String[] hobby=req.getParameterValues("hobby");
req.setAttribute("hobby",hobby);
for (String str: hobby) {
System.out.println("爱好:"+str);
}
//返回响应
//res.getWriter().println(name);
System.out.println(uname +"----------------->"+psd);
if("lkb".equals(uname)&&"abc".equals(psd)){
req.setAttribute("key",uname);
req.getRequestDispatcher("success.jsp").forward(req,res);
return;
}else{
res.sendRedirect("faile.jsp?message=error");
}
}
}
重定向会有两次请求
转发只有一次请求
总结:》重定向:可以跨域访问,两次请求。转发一次,且不可跨域访问
4、HttpServletRequest内置对象的方法
直接代码演示i:
@WebServlet("/req")
public class Req01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求数据的编码格式
req.setCharacterEncoding("utf-8");
//移除参数
//获取参数
System.out.println(req.getParameter("uname"));//lkb
String[] str=req.getParameterValues("hobby");
//存入参数
req.setAttribute("hobby",str);
for (String s: str) {
System.out.println("s---"+s);
}
//移除
req.removeAttribute("hobby");//[Ljava.lang.String;@56832b2b
System.out.println(str);
//获取项目名
String name=req.getContextPath();
System.out.println(name);///hello
//获取请求方式
System.out.println(req.getMethod());//GET
//获取请求参数
String str1=req.getQueryString();
System.out.println("str1-----"+str);//str1-----java
//获取标识符
System.out.println(req.getRequestURI());//hello/req
//获取定位符
System.out.println(req.getRequestURL());//http://localhost:8080/hello/req
//获取协议
System.out.println(req.getProtocol());//HTTP/1.1
//获取ServletContext
ServletContext sc=req.getServletContext();
System.out.println(sc);//org.apache.catalina.core.ApplicationContextFacade@5844cf8b
//获取Session
HttpSession hs= req.getSession();
System.out.println(hs);//org.apache.catalina.session.StandardSessionFacade@5c7b405b
}
}
结果:》
5、HttpServletResponse内置对象方法
代码演示:
@WebServlet("/resp")
public class Resp01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式
resp.setContentType("text/html;encoding=utf-8");
String name=req.getParameter("uname");
//输出流
resp.getWriter().println(name);
System.out.println(name);
System.out.println(resp.getOutputStream());//一般用于文件的上传和下载
//重定向
resp.sendRedirect("index.jsp");
}
}
6、作用域对象
- 会话之间:Session对象
- 请求之间:HttpServletRequest对象
- 服务器启动关闭:servletContext对象
- get/set/destory销毁,请求之间
Session:会话对象
- 默认生命周期30分钟(常用方法如下)
@WebServlet("/session")
public class Session01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个会话
HttpSession hs=req.getSession();//默认参数true,创建一个会话
//是否是新对象
System.out.println(hs.isNew());//true
//获取会话ID
System.out.println(hs.getId()); //22C157EC7D6F7D5F58AE9294B1AEC0F1
//使会话结束
hs.invalidate();
//或者移除会话
req.removeAttribute(hs.getId());//参数是会话的ID
}
}
注意:cookies是属于Session对象的一种,cookie属于客户端,存储与客户端,Session占用的是服务端的资源,所以不推荐用Session,但cookie不安全,即便可以设置其生命周期
cookie(翻译:饼干)
- 作用:会话跟踪
- 区分:瞬时cookie(默认)和持久cookie
cookie实现Session会话跟踪,在创建会话时,便会将此会话的id存放在cookie中,当session访问时,则会从cookie中的id进行比较,判断是否是之前会话
cookie常用方法:》
@WebServlet("/cookie")
public class cookie01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie
cookie cookie=new cookie("uname","psw");
//声明周期
cookie.setMaxAge(7*24*60*60);
System.out.println(cookie.getMaxAge());//604800秒
//cookie添加到响应中
resp.addcookie(cookie);
cookie[] cookies=req.getcookies();
//获取cookie对象
for (cookie c: cookies ) {
System.out.println(c.getValue());
//FFB091E551F3E9BBE2BC14FBA2BBCB70
//psw
}
//绑定路径
cookie.setPath("/cookie");
}
}
ServletContext对象
- 上下文对象,生命周期最大
- 三种创建方式①req.getServletContext() ②直接getServletContext() ③通过获取会话获取:req.getSession().getServletContext()
@WebServlet("/sc")
public class ServletContext01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建方式一
ServletContext sc1=req.getServletContext();
//方式二
ServletContext sc2=getServletContext();
//方式三
ServletContext sc3=req.getSession().getServletContext();
System.out.println(sc1+"--------"+sc2+"----------"+sc3);
}
}
补充:B/S:浏览器端/服务端(servlet就是)C/S:客户端/服务端(QQ…)



