当前位置: 首页 > news >正文

JavaWeb-Servlet基础

目录

一、创建第一个Web项目

二、Servlet介绍

三、Servlet的请求处理

四、Response对象

五、Servlet的使用流程

六、页面跳转

七、Cookie


一、创建第一个Web项目

1.需要继承HttpServlet类

2.需要重写service方法

3.需要在当前类的外面加一个注解:@webServlet("当前程序提供的对外访问的路径")

(1)这个路径我们称为URI

4.可以使用service方法的形参resp调用getWriter()方法,然后再调用write()方法向页面输出内容

(1)格式:resp.getWriter().write("要输出的内容")

5.案例:

package com.web;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;/*** @Description:com.web* @version:1.0* url:网络中的统一定位符*/
@WebServlet("/abc") //@WebServlet注解:指定在浏览器中访问java程序的名称:my 注意要带斜杠(/my是提供对外的访问路径(URI))
public class MyServlet extends HttpServlet {//提供服务@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("MyServlet运行了");//响应数据到浏览器上resp.getWriter().write("my first web");}
}

二、Servlet介绍

1.概念:

(1)狭义的:Servlet是指Java语言实现的一个接口。

(2)广义的:Servlet是指任何实现了这个Servlet接口的的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

2.特点:

(1)运行再支持java的应用服务器上(tomcat/ibm/微软)。

(2)Servlet的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的servlet进行请求处理。

(3)简单方便,可移植性强。

3.使用:

(1)创建普通的java类并继承HttpServlet;

(2)覆写service方法;

(3)在service方法中书写逻辑代码即可;

(4)在webRoot下的WEB-INF文件夹下的web.xml文件中配置servlet;

4.当前程序除了使用注解的方式可以提供对外访问的路径以外,还可以配置WEB-INF文件夹下面的web.xml文件

(1)xml文件的配置信息

<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--    当前这个xml文件中的配置相当于tomcat服务器中,所有servlet程序的目录--><servlet><servlet-name>myServlet2</servlet-name><servlet-class>com.web.MyServlet2</servlet-class></servlet><servlet-mapping><servlet-name>myServlet2</servlet-name><url-pattern>/aaa</url-pattern></servlet-mapping>
</web-app>
  • 需要先自定义两个标签servlet和servlet-mapping;
  • servlet中的servlet-name是随便写的,但是必须和下面servlet-mapping中的servlet-name对应,也就是这个两个必须是一致的;
  • servlet中的servlet-class标签之间放的是你要定义访问路径的程序的全路径名,就是包名加类名;
  • servlet-mapping中的url-pattern标签之间放的是从浏览器访问的路径,类似于注解@WebServlet("/路径"),这个路径是随便写的;
  • 流程:
    • 从浏览器访问/aaa-->找到servlet-mapping标签下的servlet-name之间的数据,再当前xml文件中查找有没有和这个servlet-name之间的数据相同的标签-->找到servlet标签下的servlet-name发现这个标签之间的数据和前面servlet-mapping下面的那个标签之间的数据相同-->再同过servlet标签下的servlet-name标签找到当前标签下的servlet-class标签之间的数据-->最后找到处理请求的对应的servlet程序。

5.运行流程:

(1)URL:http://localhost:8888/MyFirstWeb_war_exploded/bbb

(2)URL组成:服务器ip:端口号/虚拟项目名/servlet的别名(访问路径)

(3)URI是RUL的中的一部分:/虚拟项目名/servlet的别名

(4)浏览器发送请求到服务器,服务器根据请求URL地址中的RUI信息再webapps目录下找到对应的项目文件夹,然后再web.xml中检索对应的servlet,找到后调用并执行Servlet。

6.总结:Servlet就是把java代码转换为可以在服务器中运行的手段。

三、Servlet的请求处理

1.HttpServletRequest对象:用来封装浏览器发送的请求数据的对象

(1)使用HttpServletRequest对象名.getParameter("表单提交数据的name值"),可以获取用户提交的数据;

(2)使用HttpServletRequest对象名.getHeader("请求头中对应的标记"),可以获取请求头中的数据;

(3)使用HttpServletRequest对象名.getRequestURI(),可以获取客户端访问的URI;

(4)使用HttpServletRequest对象名.getRemoteAddr(),可以获取客户端ip;

2.tomcat是支持多线程的,每个请求tomcat都会创建一个新的线程去处理

3.请求服务器运行流程

4.Servlet的生命周期方法

(1)Servlet创建对象的时机是用户发送第一次请求时。

(2)init():在Servlet创建对象时调用

  • 注意:这个init方法只会在创建Servlet对象的时候调用,而Servlet对象只会在用户发送第一次请求时创建,之后的请求都会使用第一次请求所创建的对象,也就是说,init方法之后在创建Servlet对象时调用一次,之后就不会在调用了。
  • 这个方法一般用于service方法中运行需要一些提前准备的数据的初始化。

(3)destroy():在Servlet对象销毁时调用

  • 这个方法一般用于在服务器停止前销毁一些数据用的

(4)HttpServletRequest的声明周期:一次会话(发起请求到响应完成,由服务器创建,由服务器销毁)。

5.避免请求提交的中文数据乱码,可以指定请求的编码格式:

(1)HttpServletRequest对象名.setCharacterEncoding("utf-8");

6.案例:

package com.web;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;/*** @Description:com.web* @version:1.0** 总结Servlet* MyServlet4:创建对象的时机是用户发送第一次请求时* init方法只会在MyServlet4创建对象时调用一次,一般用于service方法中运行需要一些提前准备的数据的初始化* destroy方法在服务器停止的时候被调用(用来在服务器停止前销毁一些数据用的)* servlet的声明周期:是用户发送第一次请求,到服务器停止之间* HttpServletRequest:的声明周期是一次会话(发起请求到响应完成,由服务器创建,由服务器销毁)*/
public class MyServlet4 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//为了避免请求提交的中文数据乱码,指定请求的编码格式req.setCharacterEncoding("utf-8");//在springmvc中会有这个设置请求编码的过程/*** HttpServletRequest:用来封装浏览器发送的请求数据的对象*///获取用户提交的数据String uname = req.getParameter("uname");System.out.println(uname);String pwd = req.getParameter("pwd");System.out.println("pwd:" + pwd);String sex = req.getParameter("sex");System.out.println("sex:" + sex);//接收数组数据String[] favors = req.getParameterValues("favor");System.out.println("favors" + Arrays.toString(favors));//获取请求头里的数据String accept = req.getHeader("Accept");String host = req.getHeader("Host");System.out.println(accept);System.out.println(host);//获取请求行中的数据String requestURI = req.getRequestURI();String remoteAddr = req.getRemoteAddr();System.out.println("uri:" + requestURI);System.out.println("客户端ip:" + remoteAddr);//通过响应对象创建了一个流对象PrintWriter p = resp.getWriter();p.write("back data");}//在MyServlet4创建对象时调用@Overridepublic void init() throws ServletException {System.out.println("init方法被调用了");}//在MyServlet4创建对象之前调用@Overridepublic void destroy() {System.out.println("destroy方法被调用了");}
}

四、Response对象

1.设置响应头:

(1)resp.setHeader("key","value")

(2)注意:这个key和value可以随便写。

2.设置响应编码格式

(1)resp.setContentType("text/html;charset=utf-8")

3.设置响应行信息

(1)设置状态码信息

  • resp.sendError(500,"系统繁忙中,请稍后再访问")

4.设置响应体信息

(1)resp.getWrite().write("页面信息")

5.案例:

package com.web;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;
import java.io.PrintWriter;/*** @Description:com.web* @version:1.0*/
@WebServlet("/abc")
public class MyServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置响应的编码格式resp.setContentType("text/html;charset=utf-8");//设置响应体信息PrintWriter p = resp.getWriter();p.write("我是Servlet程序");//设置响应头信息resp.setHeader("mouse","logi");resp.setHeader("keybord","two birds fly");//设置响应行信息resp.sendError(500,"系统繁忙中,请稍后再访问...");}
}

五、Servlet的使用流程

1.设置请求编码格式;

2.设置响应编码格式;

3.获取请求信息;

4.处理请求信息;

5.响应处理结果;

六、页面跳转

1.请求转发

(1)格式:req.getRequestDispatcher("转发的页面").forward(req,resp)

(2)特点:

  • 浏览器地址栏信息不改变。(浏览器不知道后台服务器的数据来自哪个Servlet,浏览器一直认为请求的是第一个servlet);
  • 只有一次请求;
  • 请求转发内的servlet共享此次请求的request和response对象;
  • 不同的servlet可以处理不同的逻辑业务;

(3)注意:请求转发不适用于登录和转账

(4)使用请求转发携带数据

  • 格式:req.setAttribute("key","value")
  • 注意:将数据放入req对象中时,会将数据自动提升为Object对象。

(5)获取的携带的数据

  • 格式:req.getAttribute("key")
  • 注意:这个获取到数据的值后,需要强转一下才可以赋值

(6)案例:

  • Servlet1中的代码
  • package com.web.servlet;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;/*** @Description:com.web.servlet* @version:1.0*/
    @WebServlet("/servlet1")
    public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求和响应的编码:防止中文乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");String uname = req.getParameter("uname");System.out.println("servlet1:" + uname);/*请求转发携带数据流转到servlet2中请求对象可以实现不同servlet之间的数据共享存入数据:setAttribute(key,value)取出数据:getAttribute(key)不适于转账和登录场景*/req.setAttribute("data","abc");//数据abc放入req中,会自动提升为Object对象req.getRequestDispatcher("servlet2").forward(req,resp);}
    }
  • Servlet2中的代码
  • package com.web.servlet;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;/*** @Description:com.web.servlet* @version:1.0*/
    @WebServlet("/servlet2")
    public class Servlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求和响应的编码:防止中文乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");String data = (String) req.getAttribute("data");System.out.println("servlet2:" + data);resp.getWriter().println("欢迎来到了servlet2");}
    }

2.重定向

(1)格式:resp.sendRedirect("重定向的页面")

(2)特点:

  • 地址栏发生了变化;
  • 有两次请求;
  • 可以避免表单重复提交;

(3)注意:重定向不能像请求转发一样携带数据流转,如果我们要在重定向时携带数据流转,就需要接下来学习新的知识Session,而Session依赖于cookie,所以我们要先学习cookie。

(4)案例:

  • Servlet3中的代码
  • package com.web.servlet;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;/*** @Description:com.web.servlet* @version:1.0*/
    @WebServlet("/servlet3")
    public class Servlet3 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求和响应的编码:防止中文乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");String uname = req.getParameter("uname");System.out.println("uname:" + uname);//重定向resp.sendRedirect("servlet4");}
    }
  • Servlet4中的代码
  • package com.web.servlet;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;/*** @Description:com.web.servlet* @version:1.0*/
    @WebServlet("/servlet4")
    public class Servlet4 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置请求和响应的编码:防止中文乱码req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");resp.getWriter().println("来自于servlet4");}
    }

七、Cookie

1.cookie技术:

(1)服务端可以通过cookie技术将一些信息存储到客户的浏览器上。

(2)cookie技术其实是浏览器端的数据存储技术,解决了同一个工程下不同请求需要使用的相同的请求数据的问题。

2.特点:

(1)浏览器端的数据存储技术;

(2)适合少量数据;

(3)键值对;

(4)不安全;

(5)注意:一个cookie对象只能存储一条数据,多条数据可以创建多个cookie对象进行存储;

3.作用:cookie技术可以解决不同请求发送之间的数据共享问题。

4.修改cookie:直接覆盖就可以了。

5.cookie在默认情况下是临时存储:

(1)不设置cookie信息的存储时间,周期为一次会话,存储在浏览器的运行内存中,关闭浏览器即失效了。

(2)默认cookie存储之后,每次请求都会附带,除非设置有效路径。

6.如果想要cookie保存一段时间,可以设置cookie的有效期:

(1)格式:cookie对象名.setMaxAge(具体时间,单位为秒)

(2)使用场景:七天免登录。

7.案例:

(1)servlet1中的代码

package com.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:com.web* @version:1.0*/
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建cookie对象Cookie c1 = new Cookie("a","abc");Cookie c2 = new Cookie("b","bbb");/*设置cookie的有效时间(在这个时间内关闭浏览器,重开cookie还是存在,设置了一个时间,浏览器会把cookie存在硬盘上并倒计时,时间到达之后会销毁它)*/c1.setMaxAge(600);//单位是秒(使用场景,7天免登录)//通过响应对象,把cookie响应给浏览器,保存到浏览器上(关闭浏览器)resp.addCookie(c1);resp.addCookie(c2);}
}

(2)servlet2中的代码

package com.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:com.web* @version:1.0*/
@WebServlet("/servlet2")
public class Servlet2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取cookieCookie[] cookies = req.getCookies();for (Cookie c: cookies) {String cname = c.getName();if(cname.equals("a")){System.out.println("servlet2: " + c.getName() + "--" + c.getValue());}else if(cname.equals("b")){System.out.println("servlet2: " + c.getName() + "--" + c.getValue());}}}
}

(3)servlet3中的代码

package com.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:com.web* @version:1.0*/
@WebServlet("/servlet3")
public class Servlet3 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//修改cookieCookie c1 = new Cookie("a","aaa");resp.addCookie(c1);}
}
http://www.lryc.cn/news/620020.html

相关文章:

  • CodeBuddy在AI开发方面的一些特色
  • 1.Cursor快速入门与配置
  • PyTorch Tensor完全指南:深度学习数据操作的核心艺术
  • Matlab(4)
  • C++ stack and queue
  • 【OSPP 开源之夏】Good First issue 第一步—— openEuler Embedded 计划
  • 机器视觉的零件误差检测系统:基于多角度点云融合的圆柱体零件尺寸测量
  • 5. synchronized 关键字 - 监视器锁 monitor lock
  • InnoDB如何解决脏读、不可重复读和幻读的?
  • mysql - 查询重复数据,不区分大小重复问题解决
  • 服务器查看 GPU 占用情况的方法
  • 安全点(Safepoint)完成后唤醒暂停线程的过程
  • 响应式对象的类型及其使用场景
  • 量子安全新纪元:F5发布全新AI驱动的全栈式后量子加密AI安全方案
  • 破解测试数据困境:5招兼顾安全与真实性
  • 全球AI安全防护迈入新阶段:F5推出全新AI驱动型应用AI安全解决方案
  • 【前端Vue】使用ElementUI实现表单中可选择可编辑的下拉框
  • 仓库无人叉车的安全功能有哪些?如何在提升效率时保障安全?
  • k8s中的控制器的使用
  • 汽车高位制动灯难达 CIE 标准?OAS 光学软件高效优化破局
  • 中科米堆CASAIM汽车零部件三维扫描检测解决方案
  • 服务器通过生成公钥和私钥安全登录
  • 单例模式的理解
  • Spring Security 前后端分离场景下的会话并发管理
  • C语言:指针(4)
  • 【2025】Datawhale AI夏令营-多模态RAG-Task3笔记-解决方案进阶
  • 蓝蜂网关在雄安新区物联网建设中的关键应用
  • 补环境基础(四) Hook插件
  • Spring Boot项目调用第三方接口的三种方式比较
  • 当img占不满div时,图片居中显示,两侧加当前图片模糊效果