-
什么是servlet对象
- serlvet对象的创建,对象上方法的调用,对象的最终的销毁,Javaweb程序员是无权干预的
- serlet对象生命周期是由Tomcat服务器负责的
- 自己实例化的serlvet是不同tomcat管理的
- tomcat创建的serlvt对象,这些servlet对象都会被被放到一个集合当中(HashMap),只有梵高HashMap集合中的servlet才能够被tomcat管理,自己实例化的servlet对象不会被tomcat容器管理
package com.atguigui.servlet;
import javax.servlet.*;
import java.io.IOException;
/**Servlet的声明周期
* 1.执行servlet构造器方法
* 2.执行init初始化方法
* 第一、第二 是在第一次访问的时候创建servlet程序会调用
* 3.执行servlet方法
* 第三步,每次访问都会执行
* 4.执行destroy方法
* 第四步 再web工程停止的使用调用
*/
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("1. 默认调用无参构造函数");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 .执行初始化");
}
/**
* service方法是专门用来处理请求和响应的
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("3. 调用service方法");
}
@Override
public void destroy() {
System.out.println("4 调用destroy 销毁方法");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>index.jspwelcome-file>
<welcome-file>index.htmlwelcome-file>
welcome-file-list>
<servlet>
<servlet-name>HelloServletservlet-name>
<servlet-class>com.atguigui.servlet.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
web-app>
package com.atguigui.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**Servlet的声明周期
* 1.执行servlet构造器方法
* 2.执行init初始化方法
* 第一、第二 是在第一次访问的时候创建servlet程序会调用
* 3.执行servlet方法
* 第三步,每次访问都会执行
* 4.执行destroy方法
* 第四步 再web工程停止的使用调用
*/
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("1. 默认调用无参构造函数");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 .执行初始化");
}
/**
* service方法是专门用来处理请求和响应的
*/
@Override
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
System.out.println("3. 调用service方法");
HttpServletRequest httpServletRequest=(HttpServletRequest) req;
String method=httpServletRequest.getMethod();
System.out.println(method);
if ("GET".equals(method)){
doGet();
}else{
doPost();
}
}
@Override
public void destroy() {
System.out.println("4 调用destroy 销毁方法");
}
//自定义方法 这样做的目的是代码看起来简洁
public void doGet(){
System.out.println("做出doGet请求");
System.out.println("做出doGet请求");
System.out.println("做出doGet请求");
}
//自定义方法 这样做的目的是代码看起来简洁
public void doPost(){
System.out.println("做出doPost请求");
System.out.println("做出doPost请求");
System.out.println("做出doPost请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="http://localhost/hello" method="post">
<input type="submit" value="提交了">
form>
body>
html>
HttpSerlvet
package com.atguigui.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HttpServlet2 extends HttpServlet {
/**
* 在get请求来时会自动调用doGet()方法
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServlet2 的doGet方法");
}
/**
* 在post方法来时会自动调用dopost请求
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServlet2 的doPost方法");
}
}
整个Serlvlet类的继承体系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KI0HpXO9-1650591322569)(D:\typora\image\image-20220408235936099.png)]
SerletConfig三大作用:
- 获取Serlvet程序的别名Servlet-name的值
- 获取初始化参数init-pararm
- 获取ServletContext对象
<servlet>
<servlet-name>HelloServletservlet-name>
<servlet-class>com.atguigui.servlet.HelloServletservlet-class>
<init-param>
<param-name>usernameparam-name>
<param-value>rootparam-value>
init-param>
<init-param>
<param-name>passwordparam-name>
<param-value>1234param-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/hellourl-pattern>
servlet-mapping>
<servlet>
package com.atguigui.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**Servlet的声明周期
* 1.执行servlet构造器方法
* 2.执行init初始化方法
* 第一、第二 是在第一次访问的时候创建servlet程序会调用
* 3.执行servlet方法
* 第三步,每次访问都会执行
* 4.执行destroy方法
* 第四步 再web工程停止的使用调用
*/
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("1. 默认调用无参构造函数");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 .执行初始化");
//1.可以获取Servlet程序的别名servlet-name的值
System.out.println("HelloServlet的名称"+servletConfig.getServletName());
//2. 获取初始化参数init-param
System.out.println("username的初始化值:"+servletConfig.getInitParameter("username"));
System.out.println("password的初始化值:"+servletConfig.getInitParameter("password"));
//3. 获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
/**
* service方法是专门用来处理请求和响应的
*/
@Override
public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
System.out.println("3. 调用service方法");
HttpServletRequest httpServletRequest=(HttpServletRequest) req;
String method=httpServletRequest.getMethod();
System.out.println(method);
if ("GET".equals(method)){
doGet();
}else{
doPost();
}
}
@Override
public void destroy() {
System.out.println("4 调用destroy 销毁方法");
}
//自定义方法 这样做的目的是代码看起来简洁
public void doGet(){
System.out.println("做出doGet请求");
System.out.println("做出doGet请求");
System.out.println("做出doGet请求");
}
//自定义方法 这样做的目的是代码看起来简洁
public void doPost(){
System.out.println("做出doPost请求");
System.out.println("做出doPost请求");
System.out.println("做出doPost请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
}
servletconfig类
servletconfig类从类名上来看,就知道是serlvlet程序的配置信息类。
Selvlet程序和SevletConfig对象都是由tomcat负责创建,我们负责使用。
Serlvet程序默认是第一次访问的时候创建,sevletConfig是每个Servlet程序创建时,就创建了一个对应的ServletConfig对象。
serlertConfig类的三大作用
- 可以获取servlet程序的别名servlet-name的值
- 可以获取初始化参数init-param
- 获取ServletContext对象
package com.atguigui.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// httpServlet2只能获取在web.xml中配置的相应信息
public class HttpServlet2 extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
//必须继承父类的init()
super.init(config);
System.out.println("重写了init初始化方法");
}
/**
* 在get请求来时会自动调用doGet()方法
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServlet2 的doGet方法");
//在web.xml中配置的servlet 只能访问自己类下的初始化方法
System.out.println(getServletConfig().getServletName());
String username = getInitParameter("username");
String password = getInitParameter("url");
System.out.println(username+": "+password);
}
/**
* 在post方法来时会自动调用dopost请求
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HttpServlet2 的doPost方法");
}
}
ServletContext类
- servletcontext是一个接口,他表示上下文对象
- 一个web工程,只有一个ServletContext对象实例。
- ServletContext对象是一个域对象
什么是域对象
- 域对象,是可以像Map一样存取数据的对象,叫域对象
- 这里的域指的是存取数据的 *** 作范围。
存数据 | 取数据 | 删除数据 | |
---|---|---|---|
Map | put() | get() | remove() |
域对象 | setAttribute() | getAttribute() | removeAttribute() |
获取web.xml中配置的上下文参数 context-param
获取当前的工程路径,格式/工程路径
获取工程部署后在服务器硬盘上的绝对路径
像Map一样存取数据
web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>a.htmlwelcome-file>
welcome-file-list>
<context-param>
<param-name>usernameparam-name>
<param-value>yangkuiparam-value>
context-param>
<context-param>
<param-name>passwordparam-name>
<param-value>yangkuiparam-value>
context-param>
package com.atguigui.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
/**
* 获取web.xml中配置的上下文参数 context-param
*
* 获取当前的工程路径,格式/工程路径
*
* 获取工程部署后在服务器硬盘上的绝对路径
*
* 像Map一样存取数据
*/
public class ContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
//获取web.xml中配置的上下文参数 context-param
ServletContext context = getServletConfig().getServletContext();
String username=context.getInitParameter("username");
System.out.println(username);
String password=context.getInitParameter("password");
System.out.println(password);
//获取当前的工程路径,格式/工程路径
String contextPath = context.getContextPath();
System.out.println("获取当前工程路径"+contextPath);
//获取工程部署后在服务器硬盘上的绝对路径
//这里的 “/”代表着被服务器解析地址为http://ip:port/工程名/ 映射IDEA代码的web目录
String realPath=context.getRealPath("/");
System.out.println("真实路径"+realPath);
String realCssPath=context.getRealPath("/css");
System.out.println(realCssPath);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
package com.atguigui.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "ContextServlet1", value = "/ContextServlet1")
public class ContextServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
context.setAttribute("key","value1");
//在其他类中也可以访问到context.getAttribute("key")属性,随着程序结束而释放
System.out.println("获取servletContext的值为"+context.getAttribute("key"));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
HTTP ServletRequest类
-
HttpServletRequest类
HttpServletRequest类有什么作用
- 每次只要有请求进入tomcat服务器,tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后出传递到service(doGet和doPost)方法中给我们使用,我们可以通过HttpSerlvetRequest对象,获取到所有请求的信息
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的同一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的IP地址
- getHeader() 获取请求头
- getParameter() 获取请求的参数
- getParameterValues() 获取请求的参数(多个值的时候使用)
- getMethod() 获取请求的方法GET或POST
- setAttribute(key,value) 设置域数据
- getAttribute(key) 获取域数据
- getRequestDispatcher() 获取请求转发的对象
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="http://localhost/parameterServlet" method="get">
用户名 <input type="text" name="username">
密 码<input type="password" name="password">
爱好 <input type="checkbox" name="hobby" value="java">java
<input type="checkbox" name="hobby" value="c++">c++
<input type="checkbox" name="hobby" value="js">js
<input type="submit">
form>
body>
html>
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用getParameter可以获取前端页面传入的属性值
String username=req.getParameter("username");
String password=req.getParameter("password");
//checkbox多属性 要使用getParameterValues()方法接受
String[] hobby=req.getParameterValues("hobby");
System.out.println("用户名"+username);
System.out.println("密码"+ password);
System.out.println("爱好"+ Arrays.asList(hobby));
}
请求转发:
请求转发是指,服务器受到请求后,从一次资源跳转到另一个资源的 *** 作叫请求转发
请求转发的特点
- 浏览器地址栏没有发生任何变化
- 他们是一次请求
- 他们共享Request域中的数据
- 可以转发到WEB-INF下
- 不能访问工程下以外的地方
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是serlvet1");
String username=req.getParameter("username");
req.setAttribute("key1","柜台一的章");
//getRequestDispatcher("/转发位置").forward(req,resp);
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
requestDispatcher.forward(req,resp);
}
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是serlvet2");
String username=req.getParameter("username");
Object key1 = req.getAttribute("key1");
System.out.println("检验柜台一的章"+key1);
//处理自己的业务
System.out.println("写serlvet2里面自己的东西");
}
base标签
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转
<head>
<meta charset="UTF-8">
<title>不是首页title>
<base href="http://localhost/a/b/c.html">
head>
<body>
<a href="../../index.html">c跳转到indexa>
<p>不是首页p>
body>
HttpServletResponse类
HttpSerletResponse类的作用
HttpServletResponse类和HttpServlet类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有相应的信息,
我们如果需要设置返回个客户端的信息,都可以通过HttpServletResponse对象进行设置
两个输出流的说明
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter() ; 常用于回传字符串(常用)
两个流同时只能使用一个
使用了字节流,就不能在使用字符流,反之亦然,否则就会报错
public class ResponseIoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 要求,往客户端回传 字符串 数据
//输出流是UTF-8 同时也要告诉浏览器要使用UTF-8设置
resp.setHeader("Content-type", "text/html;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
//设置setContentType()它会同时设置服务器和客户端都使用UTF-8字符集,还设置了相应头
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("我是大傻逼");
}
}
请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说,我给你一些地址,你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)
请求重定向的特点
- 浏览器地址栏会放生变化
- 两次请求
- 不能共享Request域中的数据
- 不能访问WEB-INF下的资源
- 可以访问工程外的资源
//方案一
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("到此一游Response1");
//设置状态码 表示重定向
resp.setStatus(302);
//设置响应头,说明新的地址在哪里
resp.setHeader("location","http://localhost/response2");
//方案而
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("到此一游Response1");
resp.sendRedirect("http://localhost/response2");
}
public class Response2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这里是Response2,重定向来的");
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)