什么是servlet?

什么是servlet?

前面一篇在讲解 简单了解request与response ,王小提出 Servlet 的疑惑,下面对 Servlet 做简单总结。

1. 什么是servlet?

在 JavaWeb 项目中,处理请求和发送响应的过程是由一种叫做 Servlet 的程序来完成的,并且 Servlet 是为了解决实现动态页面而衍生的东西。

简单来讲:Servlet其实就是一个遵循Servlet开发的java类,Serlvet是由服务器调用的,运行在服务器端。

一张图描述 Servler 在 B/S 中的作用点:

2. Tomcat 和 Servlet 的关系

Tomcat 是Web应用服务器,是一个Servlet/JSP容器。 Tomcat 作为 Servlet 容器,负责处理客户请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户,而 Servlet 是一种运行在支持 Java 语言的服务器上的组件。

Servlet 最常见的用途是扩展 Java Web 服务器功能,提供非常安全的、可移植的、易于使用的 CGI 替代品。

从 Http 协议中的请求和响应可以得知,浏览器发出的请求是一个请求文本,而浏览器接收到的也应该是一个响应文本。但是在上面这个图中,并不知道是如何转变的,只知道浏览器发送过来的请求也就是 request,我们响应回去的就用 response。忽略了其中的细节,现在就来探究一下。

①:Tomcat 将 Http 请求文本接收并解析,然后封装成 HttpServletRequest 类型的 request 对象,所有的 Http 头数据读可以通过request 对象调用对应的方法查询到。

②:Tomcat 同时会要响应的信息封装为 HttpServletResponse 类型的response 对象,通过设置 response 属性就可以控制要输出到浏览器的内容,然后将 response 交给 Tomcat,Tomcat 就会将其变成响应文本的格式发送给浏览器。

Java Servlet API 是Servlet容器(tomcat)和servlet之间的接口,它定义了Serlvet 的各种方法,还定义了 Servlet 容器传送给 Servlet 的对象类,其中最重要的就是 ServletRequest 和 ServletResponse 。所以说我们在编写Servlet时,需要实现 Servlet 接口,按照其规范进行操作。

3. Servlet 接口主要方法

Servlet 接口主要的 3 个方法:

  • init()方法:只会调用一次,只是在创建servlet实例的时候才会创建。
  • service()方法:是进行数据处理的,只要接受了一次请求,就会被调用一次
  • destroy()方法:销毁 Servlet 对象的时候调用。停止服务器或者重新部署 Web 应用时销毁 Servlet 对象,同样也是调用一次

4. 编写 Servlet

首先说明一点疑惑,有时候我们在一些资料上看到别人这样写:

public class TestServlet implements Servlet {

    init()...

    service()...

    getServletConfig()...

    ...
}

而在这我们要继承 HttpServlet类 那么问题来了,继承HttpServlet 和实现Servlet 有什么区别?

首先,直观的不同,Servlet 是一个接口,如果实现这个接口,那么就必须实现接口里面定义的所有方法。

而 HttpServlet 实现了 Servlet 接口,并把 Servlet 接口中的方法实现了。
继承 Httpservelt,实际上也就实现了 Servlet 接口。

但是我们没必要再去实现 Servlet 中定义的生命周期方法,因为在 Httpservlet 中已经有了默认实现,并且这些默认实现也挺规范和实用, doget 和 dopost 是执行用户请求的终点,get 请求会调用 doget 方法,post 请求会执行 dopost 方法,我们可以在这2个方法中定义我们自己的业务逻辑。

最后,HttpServlet 在实现 Servlet 接口的时候,已经实现了 Servlet 中所有的方法,因此继承自 HttpSrvlet 的类,不需要再去覆写相应的生命周期等方法。

4.1 编写Java类,继承HttpServlet

创建一个 MyServlet java 类,继承 HttpServlet 实现 service 方法:

public class MyServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置字符编码
        request.setCharacterEncoding("utf8");
        //从 request 对象中获取username,password
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        request.setAttribute("username",username);
        request.setAttribute("password",password);
        request.getRequestDispatcher( "/index2.jsp").forward(request, response);;
    }
}

4.2 配置web.xml文件

web.xml 配置 Servlet 访问路径,能让别人通过链接访问到你的 Servlet:

<web-app>
  <display-name>Archetype Created Web Application</display-name>

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>club.sscai.demo.MyServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>

</web-app>

4.3 jsp 界面显示

index2.jsp:

<html>
<body>
<h2>2222222</h2>
username: 
<%=request.getParameter("username") %>
<br>
password: 
<%=request.getParameter("password") %>
</body>
</html>

访问:http://localhost:8080/MyServlet?password=1111&username=222 效果如下:

5. 总结

前台界面附带的参数,可以通过 request 获取,这也证实了前面 HttpServletRequest 封装了 request对象,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中。

关于 request\response,在实际项目开发中,request 是非常常用的,毕竟你要拿到用户请求的信息,才能知道用户要什么,但是,像上文中这种继承自 HttpServlet 是不会出现的,例如,采用 Spring MVC 框架后,自动帮我们实现了 request 请求到 Controller 的骚操作。

posted @ 2019-03-28 20:52 niceyoo 阅读(...) 评论(...) 编辑 收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TabLayout中的Tab.setCustomView左右有空隙,TabLayout下划线间隙设置,下划线长度设置

间隙设置为零 因为当我们引入TabLayout时就已经默认tabPaddingStart为12dp,tabPaddingEnd为12dp.才会导致不能填满的原因&#xff0c;这时我们只需要修改样式或者属性即可。 xmlns:app"http://schemas.android.com/apk/res-auto" app:tabPaddingStart"0dp&quo…

快速解析大xml报文

如何快速解析大的xml文件。 案例&#xff1a; package grp.pb.branch.qinhuangdao.batchvoucher.impl;import java.io.File; import java.util.List;import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader…

idea搭建可运行Servlet的Web项目[maven]

idea搭建可运行Servlet的Web项目[maven] 1. new Project File > new > Project… 2. 填写 GroupID\ArtifactID GroupID 是项目组织唯一的标识符&#xff0c;实际对应JAVA的包的结构&#xff0c;是main目录里java的目录结构。 ArtifactID 是项目的唯一的标识符&#xff0…

Android 自定义年月日日期选择器、时分时间选择器

实现效果&#xff1a; 日期选择器 时间选择器 实现方法&#xff1a; 1、自定义选择器dialog public class DatePickDialog extends Dialog implements OnChangeLisener {private Tex…

main.js中封装全局登录函数

main.js中封装全局登录函数 1. 在 main.js 中封装全局登录函数 通过 vue 对象的原型扩展&#xff0c;可以扩展一个函数&#xff0c;这样这个函数就可以在每一个界面通过类似指向对象的方式&#xff0c;去访问这个函数。 如下是 main.js 扩展的函数&#xff1a; Vue.prototype.…

Android 人脸照片对比,人脸对比

1、首先在百度云平台&#xff0c;注册账号&#xff0c;并且进行企业验证 https://console.bce.baidu.com/#/index/overview 2、进入人脸识别主页&#xff0c;创建应用 3、创建SDK授权应用 SDK与完整demo链接&#xff1a; demoCSDN链接&#xff1a;https://download.csdn.net…

iOS 里const在修饰对象时候的用法

玩iOS的小伙伴对const应该很不陌生, 在声明全局常量的时候很多时候都会用到, 但是有时候修饰对象很迷惑下面是个人总结, 下面的地址都是模拟的 1. const NSString *str1 "123"; str1 "ads"; /*-- 对象地址 -- 对象 -- 指向的地址 ---- 值 ------ 值地址…

uni-app第三方登陆-微信

uni-app第三方登陆-微信 结合上文全局登陆校验&#xff0c;实现微信授权登录官方手册地址&#xff1a; https://uniapp.dcloud.io/api/plugins/login?idgetuserinfo 一、书写两个界面 login.vue 用于用户登陆my.vue 我的界面&#xff0c;存放校验登陆的函数1.1 my.vue <sc…

Android获取屏幕尺寸,屏幕适配

获取屏幕尺寸&#xff1a; DisplayMetrics dm new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int w dm.widthPixels;//宽 int h dm.heightPixels;//高 Log.i("lgq","ww"w"....h"h); 输出&#xff1a;2019…

点击一百万次

在一个群里看到的题目&#xff0c;就找他要来玩儿了。http://120.24.86.145:9001/test/得点击一百万次图片才行。 可以看出&#xff0c;是通过jqeury发包操作点击量的&#xff0c;所以只需要发一个包控制点击量就ok了 转载于:https://www.cnblogs.com/nul1/p/8611341.html

基于token与基于服务器的身份认证

基于token与基于服务器的身份认证 1、基于服务器的身份认证 我们清楚 http 协议是无状态的&#xff0c;也就是说&#xff0c;如果我们已经认证了一个用户&#xff0c;那么他下一次请求的时候&#xff0c;服务器不知道我是谁&#xff0c;我们就必须要再次认证。 我们与浏览器交…

Android 视频通话

基于腾讯云视频SDK 实现效果 实现步骤&#xff1a; 1、登录腾讯云开发者平台 https://cloud.tencent.com/product/trtc 2、进入 实时音视频 主页。并创建应用 进入实时音视频方法&#xff1a;点击——控制台——>云产品 3、进入开发辅助主页&#xff0c;创建uid 第四…

c++的作业2

本题再次加深了我对于素数与非素数的认识&#xff0c;以及学会了控制每行素数的个数。 本题&#xff0c;让我再一次加深对于是switch的用法&#xff0c;case中只能是常量表达式&#xff0c; break&#xff0c;continue都适用于三种循环结构&#xff0c;即&#xff0c;for&#…

JPA分页查询与条件分页查询

情有独钟的JPA 平时在写一些小项目时&#xff0c;比较喜欢引用 Spring Data Jpa&#xff0c;其实还是图他写代码快~ 在日常的开发工作中&#xff0c;分页列表查询基本是随处可见&#xff0c;下面一起看一下如何使用 jpa 进行多条件查询以及查询列表分页呢&#xff1f; 关于JPA的…

Android 创建文件,删除文件,加载本地txt文件,string转txt文件,创建文件夹,读取文件夹,open failed: ENOENT

1、创建文件 String fileName "my.txt"; File fs new File(Environment.getExternalStorageDirectory() "/msc/" fileName); 安卓10内存文件 String downFileDir context.getFilesDir().getAbsolutePath(); File dest new File(downFileDir, te…