Servlet入门 MVC实战项目 仓储管理系统

  • Servlet 入门Demo
  • Servlet 执行流程、生命周期
    • 执行流程
    • 生命周期
    • Servlet API介绍
    • Servlet体系结构
    • Servlet urlPattern配置
  • Servlet:请求与响应
  • Request:请求
    • 请求的构成
    • 请求API方法来获取对应的值:
    • 请求参数的获取方式
    • 请求转发
  • Response:响应
    • 响应的构成
    • API介绍
    • 重定向

Redis章节复习已经过去,新的章节JavaWeb开始了,这个章节中将会回顾JavaWeb实战项目 仓储管理
代码会同步在我的gitee中去,觉得不错的同学记得一键三连求关注,感谢:
Servlet入门:JavaServletProject
仓储管理系统: JavaWebProject

Servlet 入门Demo

我们从上一节已经了解到,web只有两个动作,请求和响应,而servlet就是我们实现动作的中间工具;

  • Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。
  • 使用Servlet就可以实现,根据不同的登录用户在页面上动态显示不同内容。
  • Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
  1. 创建Web项目web-demo,导入Servlet依赖坐标
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><!--此处为什么需要添加该标签?provided指的是在编译和测试过程中有效,最后生成的war包时不会加入因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错--><scope>provided</scope>
</dependency>
  1. 创建:定义一个类,实现Servlet接口,并重写接口中所有方法
//在类上使用@WebServlet注解,配置该Servlet的访问路径
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("servlet hello world~");}public void init(ServletConfig servletConfig) throws ServletException {}public ServletConfig getServletConfig() {return null;}public String getServletInfo() {return null;}public void destroy() {}
}
  1. 访问:启动Tomcat,浏览器中输入URL地址访问该Servlet
http://localhost:8080/web-demo/demo1

如果打印hello,说明已经成功

Servlet 执行流程、生命周期

执行流程

通过以上的Demo,我们分析下对应的流程:
浏览器发出http://localhost:8080/web-demo/demo1请求,从请求中可以解析出三部分内容,分别是localhost:8080web-demodemo1

  • 根据localhost:8080可以找到要访问的Tomcat Web服务器
  • 根据web-demo可以找到部署在Tomcat服务器上的web-demo项目
  • 根据demo1可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配

找到ServletDemo1这个类后,Tomcat Web服务器就会为ServletDemo1这个类创建一个对象,然后调用对象中的service方法

  • ServletDemo1实现了Servlet接口,所以类中必然会重写service方法供Tomcat Web服务器进行调用
  • service方法中有ServletRequest和ServletResponse两个参数,ServletRequest封装的是请求数据,ServletResponse封装的是响应数据,后期我们可以通过这两个参数实现前后端的数据交互
  1. Servlet由谁创建?Servlet方法由谁调用?

Servlet由web服务器创建,Servlet方法由web服务器调用

  1. 服务器怎么知道Servlet中一定有service方法?

因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法

生命周期

Tomcat什么时候创建的Servlet对象?

@WebServlet(urlPatterns="/demo2",loadOnStartup = 1)
public class ServletDemo2 implements Servlet {/*** 初始化方法* 1. 调用时机:默认情况下,Servlet被第一次访问时,调用*      * loadOnStartup:* 2. 调用次数:1次* @param config* @throws ServletException*/@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("init...");}/*** 提供服务* 1. 调用时机:每一次Servlet被访问时,调用* 2. 调用次数:多次*** @param req* @param res* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {System.out.println("servlet hello world~");}/*** 销毁方法* 1. 调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用* 2. 调用次数:1次*/@Overridepublic void destroy() {System.out.println("destroy...");}@Overridepublic String getServletInfo() {return null;}@Overridepublic ServletConfig getServletConfig() {return null;}
}

Servlet API介绍

Servlet体系结构

我们在平时开发,更常用的HttpServlet类;

其底层其实就是
根据请求方式的不同,进行分别的处理

@WebServlet("/WEB")
public class MyHttpServlet implements Servlet {@Overridepublic void init(ServletConfig config) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// 根据请求方式的不同,进行分别的处理HttpServletRequest request = (HttpServletRequest) req;//1. 获取请求方式String method = request.getMethod();//2. 判断if("GET".equals(method)){// get方式的处理逻辑doGet(req,res);}else if("POST".equals(method)){// post方式的处理逻辑doPost(req,res);}}protected void doPost(ServletRequest req, ServletResponse res) {}protected void doGet(ServletRequest req, ServletResponse res) {}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("get...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("post...");}
}

Servlet urlPattern配置

Servlet类编写好后,要想被访问到,就需要配置其访问路径urlPattern

Servlet:请求与响应

我们使用Servlet的时候有看到:

    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("get...");}

这里会提供HttpServletRequest req, HttpServletResponse resp
==Request是请求对象,Response是响应对象。

request:获取请求数据

  • 浏览器会发送HTTP请求到后台服务器[Tomcat]
  • HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]
  • 后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中
  • 所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数
  • 获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务

response:设置响应数据

  • 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据
  • 把响应数据封装到response对象中
  • 后台服务器[Tomcat]会解析response对象,按照[响应行+响应头+响应体]格式拼接结果
  • 浏览器最终解析结果,把内容展示在浏览器给用户浏览
//启动成功后就可以通过浏览器来访问,并且根据传入参数的不同就可以在页面上展示不同的内容:
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//使用request对象 获取请求数据String name = request.getParameter("name");//url?name=zhangsan//使用response对象 设置响应数据response.setHeader("content-type","text/html;charset=utf-8");response.getWriter().write("<h1>"+name+",欢迎您!</h1>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("Post...");}
}

Request:请求

请求的构成

HTTP请求数据总共分为三部分内容,分别是请求行、请求头、请求体

请求API方法来获取对应的值:

/*** request 获取请求数据*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// String getMethod():获取请求方式: GETString method = req.getMethod();System.out.println(method);//GET// String getContextPath():获取虚拟目录(项目访问路径):/request-demoString contextPath = req.getContextPath();System.out.println(contextPath);// StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1StringBuffer url = req.getRequestURL();System.out.println(url.toString());// String getRequestURI():获取URI(统一资源标识符): /request-demo/req1String uri = req.getRequestURI();System.out.println(uri);// String getQueryString():获取请求参数(GET方式): username=zhangsanString queryString = req.getQueryString();System.out.println(queryString);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

结果展示

GET
/request
http://localhost:8080/request/req1
/request/req1
name=3
Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Mobile Safari/537.36 Edg/108.0.1462.46

请求参数的获取方式

  1. Get方式:通过String getQueryString来实现
    @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// String getQueryString():获取请求参数(GET方式): username=zhangsanString queryString = req.getQueryString();System.out.println(queryString);}
  1. Post方式:通过BufferedReader getReader() 实现
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取post 请求体:请求参数//1. 获取字符输入流BufferedReader br = req.getReader();//2. 读取数据String line = br.readLine();System.out.println(line);}
  1. 获取多个请求参数
    request对象已经将上述获取请求参数的方法进行了封装;
  • 我们给定一个页面

在Servlet代码中获取页面传递GET请求的参数值

/*** request 通用方式获取请求参数*/
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//GET请求逻辑System.out.println("get....");//1. 获取所有参数的Map集合Map<String, String[]> map = req.getParameterMap();for (String key : map.keySet()) {// username:zhangsan lisiSystem.out.print(key+":");//获取值String[] values = map.get(key);for (String value : values) {System.out.print(value + " ");}System.out.println();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
}

请求转发

请求转发(forward):一种在服务器内部的资源跳转方式。


(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求

(2)资源A处理完请求后将请求发给资源B

(3)资源B处理完后将结果响应给浏览器

(4)请求从资源A到资源B的过程就叫请求转发

req.getRequestDispatcher("资源B路径").forward(req,resp);

请求转发资源间共享数据:使用Request对象
存储数据到request域[范围,数据是存储在request对象]中void setAttribute(String name,Object o);
根据key获取值Object getAttribute(String name);
根据key删除该键值对void removeAttribute(String name);

@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo5...");//存储数据request.setAttribute("msg","hello");//请求转发request.getRequestDispatcher("/req6").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
/*** 请求转发*/
@WebServlet("/req6")
public class RequestDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo6...");//获取数据Object msg = request.getAttribute("msg");System.out.println(msg);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

特点

  1. 浏览器地址栏路径不发生变化,虽然后台从/req5转发到/req6,但是浏览器的地址一直是/req5,未发生变化

  2. 只能转发到当前服务器的内部资源, 不能从一个服务器通过转发访问另一台服务器

  3. 一次请求,可以在转发资源间使用request共享数据,虽然后台从/req5转发到/req6,但是这个只有一次请求

Response:响应

响应的构成


API介绍

重定向

Response重定向(redirect):一种资源跳转方式。


(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求

(2)资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径

(3)浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B

(4)资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫重定向

resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");

实现Demo

@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("resp1....");//重定向resposne.sendRedirect("/request-demo/resp2");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("resp2....");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

重定向的特点

  1. 浏览器地址栏路径发送变化,当进行重定向访问的时候,由于是由浏览器发送的两次请求,所以地址会发生变化
  2. 可以重定向到任何位置的资源(服务内容、外部均可),因为第一次响应结果中包含了浏览器下次要跳转的路径,所以这个路径是可以任意位置资源。
  3. 两次请求,不能在多个资源使用request共享数据,因为浏览器发送了两次请求,是两个不同的request对象,就无法通过request对象进行共享数据

要想将字符数据写回到浏览器,我们需要两个步骤:

  • 通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();
  • 通过字符输出流写数据: writer.write(“aaa”);
    返回字符数据到浏览器
/*** 响应字符数据:设置字符数据的响应体*/
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//1. 获取字符输出流PrintWriter writer = response.getWriter();writer.write("aaa");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

返回一个图片文件到浏览器

/**
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>* 响应字节数据:设置字节数据的响应体*/
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 读取文件FileInputStream fis = new FileInputStream("d:/java/1.jpg");//2. 获取response字节输出流ServletOutputStream os = response.getOutputStream();//3. 完成流的copyIOUtils.copy(fis,os);fis.close();}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

JavaWeb框架(二):Servlet组件入门相关推荐

  1. java web netty_基于Netty的非Servlet规范 JavaWeb框架及高性能 Java服务器

    Bay 一个非Servlet规范的JavaWeb框架,包括一个基于Netty的高性能服务器. ##介绍 这是一个基于Netty实现的非Servlet规范的Web服务器,由于底层设计经验不足,所以实际上 ...

  2. python_爬虫 16 Scrapy框架之(二)快速入门

    目录 一.安装和文档: 二.快速入门: 1.创建项目: 2.目录结构介绍: 3.使用Scrapy框架爬取糗事百科段子: 使用命令创建一个爬虫: 爬虫代码解析: 修改settings.py代码: 简单运 ...

  3. 【代码审计-JAVA】基于javaweb框架开发的

    前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章). 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edus ...

  4. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

    目录 前言 1. 学习路线 2. 学习方法 前言 这篇文章主要总结我之前所学过的框架以及学习路线 从实打实的零基础到框架再到项目 之后实习工作 也在这篇博客中记录我的学习笔记 以及在笔记中遇到的配置安 ...

  5. java web框架struts,JavaWeb框架_Struts2_(五)-----Struts2的标签库

    1.Struts2的标签库 1.1 Struts2标签库概述 Struts2的标签库可以分为以下3类:用户界面标签.非用户界面标签.AJAX标签; 2.1.1 Struts2标签库的分类和使用 1.  ...

  6. Servlet的入门

    什么是Servlet? Servlet是运行在服务端的java小程序,是sun公司提供的一套规范,用来处理客户端请求.响应给浏览器的动态资源.Servlet是JavaWeb三大组件之一(Setvlet ...

  7. MVC 模式/Servlet/JSP 编译原理剖析:Servlet 组件到底属于 MVC 模式的哪一层?

    文章目录 前言 一.回忆什么是 MVC 模式? 1.1.Model.View.Controller 组件介绍 1.2.明确 View 与 Controller 组件区别 二.什么是 Servlet? ...

  8. CTK框架——CTK Widgets快速入门

    CTK框架--CTK Widgets快速入门 天山老妖S关注0人评论27888人阅读2018-05-25 18:40:52 CTK框架--CTK Widgets快速入门 一.CTK Widgets模块 ...

  9. Day14-HTTP协议 web开发概述 servlet快速入门

    HTTP:HyperText Transfer Protocol 超文本传输协议 用于定义web浏览器和web服务器之间交换数据的过程 特点: 基于请求/响应模型的协议.请求和相应必须成对出现,现有请 ...

最新文章

  1. PyTorch深度学习入门
  2. 在JavaScript中使用json.js:访问JSON编码的某个值
  3. 卡尔曼滤波(Calman Filter)基本原理
  4. bcb6通过https接口post数据_Python+Requests+Pytest+YAML+Allure实现接口自动化
  5. JS计算两个日期时间差,天 小时 分 秒格式
  6. 一般来讲,大公司都有自己的决策团队
  7. 三维数组地址计算_C语言进阶之路:数据类型 - 多维数组与指针!我的心中只有学习!...
  8. SDN第四次上机作业
  9. ie下使用frameset布局导致跨域cookie丢失问题解决
  10. [转]linux 调用动态库so文件
  11. codeblock 添加 .lib 文件
  12. 如何在一周内摸清一个行业
  13. Win 10上帝模式 的开启和高级隐藏文件
  14. 【CodeForces645G】Armistice Area Apportionment
  15. Word文档引用EndNote中文献的方法
  16. 基于单链表快排的优化算法
  17. MonoRail例子(入门篇)
  18. Android Studio的安装 环境搭建
  19. 日化美妆难突围,看爱码物联如何冲破传统营销壁垒
  20. 软考A计划-试题模拟含答案解析-卷十

热门文章

  1. 干货!Python操作PDF的神器——PyMuPDF
  2. 织梦官方幻灯片调用以及幻灯片模糊的处理办法
  3. 高通量测序在物种鉴定中的应用
  4. 人际关系——做事要周全
  5. Anuglar8集成高德地图
  6. 国产网络分析仪的介绍
  7. Python创建使用虚拟环境
  8. 【blender建模功能】03 倒角工具
  9. 微信小程序对接快递鸟接口返回格式有误的解决
  10. ML之VC维:VC维(Vapnik-Chervonenkis Dimension)理论的概述(衡量模型复杂度和预测能力的指标)的简介、案例理解之详细攻略