• Servlet快速入门


    目录

    1、Servlet简介

    2、代码实现

    2.1、环境准备

    2.2、实现servlet接口

    2.3、配置web.xml文件

    2.4、url-pattern的三种配置方式

    2.5、快速创建Servlet

    2.6、修改快速创建模版(针对以上模版不一致或者webServlet中请求路径没有/)

    3、项目部署位置(面试题)

    4、绝对路径和相对路径

    4.1、绝对路径

    4.2、相对路径

    5、ServletConfig和ServletContext

    5.1、ServletConfig

    5.2、ServletContext

    5.3、两者区别


     

    1、Servlet简介

    Servlet 是sun公司提供的一门用于开发动态web资源的技术 Servlet 是基于Request Response编程模型 Sun公司在其API提供了一个servlet接口,用户若想开发一套动态的web项目,需要完成以下2步骤:

    1、编写一个java类,实现servlet接口。

    2、把开发好的程序布署到服务器中。

    servlet的作用:

    1、接受浏览器发送过来的消息。
    2、给浏览器返回消息,浏览器认识html,可以动态去输出html。

    Request:请求。客户端向服务端发送的信息。
    Response:响应。服务器向客户端发送的信息。
    通常请求和响应是成对出现的。

    2、代码实现

    2.1、环境准备

    在实现servlet之前,我们需要配置一下tomcat,因为tomcat里面有servlet相关jar包,如果不导入tomcat,那么servlet的方法是不能被使用的。

    在idea右上角有个Edit Configurations选项,点击打开 

    选择Templates,往下寻找Tomcat Server 

    找到Tomcat Server,选择Local(本地)

     

    点击右上角有个Configure按钮,点击打开 

    在下面的选框中导入Tomcat的路径后点击OK。

     

    把JRE框中选择使用你电脑安装的JDK,这里我用的是JDK1.8。

    点击Apply后OK。

    之后,点击左上角加号

     找到Tomcat Server,并点击Local

     

    点击Deployment后点击后边的+号,

     选择Artifact添加项目

     

     出现以下画面就代表添加成功,建议把下面的Application context请求路径改为/

    首先创建一个web项目,然后创建一个servlet包用来存放servlet类

    创建第一个Servlet类

    2.2、实现servlet接口

    1. public class MyServlet implements Servlet {
    2. //servlet初始化方法
    3. @Override
    4. public void init(ServletConfig servletConfig) throws ServletException {
    5. System.out.println("==========servlet init===========");
    6. }
    7. @Override
    8. public ServletConfig getServletConfig() {
    9. return null;
    10. }
    11. //业务方法
    12. @Override
    13. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    14. System.out.println("=============servlet service============");
    15. //servletRequest对象强转为HttpServletRequest对象
    16. HttpServletRequest request=(HttpServletRequest) servletRequest;
    17. String username = request.getParameter("username");
    18. System.out.println(username);
    19. }
    20. @Override
    21. public String getServletInfo() {
    22. return null;
    23. }
    24. //servlet销毁方法
    25. @Override
    26. public void destroy() {
    27. System.out.println("==========servlet destroy===========");
    28. }
    29. }

    写好这个servlet类就能够完成了吗,还不行,需要进行配置web.xml文件 

    2.3、配置web.xml文件

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>MyServletservlet-name>
    8. <servlet-class>cn.itssl.servlet.MyServletservlet-class>
    9. servlet>
    10. <servlet-mapping>
    11. <servlet-name>MyServletservlet-name>
    12. <url-pattern>/MyServleturl-pattern>
    13. servlet-mapping>
    14. web-app>

    启动Tomcat服务器

    在浏览器地址栏中输入localhost:8080/MyServlet,注意:这里8080后面的内容就是配置文件url-pattern标签写的内容 

     

    可以看到,点击回车后,idea控制台输出了我在初始方法和service方法中写的输出语句,servlet被成功的初始化了,后面是null是因为我在地址栏没有提交一个参数,所以获取到的是null,现在我提交一个参数username看看效果

     

    可以看到service方法又被调用了,而且参数username也被输出到了控制台。可以发现初始化方法只被执行了一次,后面再提交就不会调用了。

    2.4、url-pattern的三种配置方式

    1. 1、完全路径匹配,以”/”开头 后面是具体的路径信息。
    2. 你输入什么内容。访问的时候,就需要输入什么内容,才可以找到对应的servlet
    3. 例如
    4. <url-pattern>/hellourl-pattern>
    5. 2、目录匹配,以/*结尾
    6. <url-pattern>/*url-pattern>
    7. http://ip:端口/abc/abx
    8. http://ip:端口/abc/bdsf
    9. 3、扩展名匹配 *.扩展名 注意: *.扩展名(正确) /*.扩展名(错误)
    10. <url-pattern>*.dourl-pattern>
    11. <url-pattern>*.actionurl-pattern>
    12. *.do
    13. *.action

    2.5、快速创建Servlet

    重写Servlet虽然能够获取request与response对象获取参数,但是还必须每次都得进行强转,而且重写方法里面只有service方法会被用到,其他方法大部分是用不到的,那么我们需要去快速创建一个简洁方便的servlet类。借助idea开发工具可以快速的创建servlet

    1、自己去定义的servlet 只需要继承HttpServlet 就可以实现 servlet的接口了。

    2、以后处理用户的请求,都写在doGet或者doPost方法中。

    在新建里面找到servlet选项 

     只需要修改名字就可以,其他路径都不用动,修改完名字点击OK。 

     

    这个模版里面使用了注解形式设置请求路径,所以就不用在web.xml配置文件中设置servlet以及servlet-mapping标签了。 

    1. @WebServlet(urlPatterns = "/RegisterServlet")
    2. public class RegisterServlet extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. String username = request.getParameter("username");
    5. String pwd = request.getParameter("pwd");
    6. System.out.println("用户名:"+username+" 密码:"+pwd);
    7. }
    8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. this.doPost(request, response);
    10. }
    11. }

    2.6、修改快速创建模版(针对以上模版不一致或者webServlet中请求路径没有/)

    如果出现以上模版中不一样,或者说请求路径是name=xxxx,没有/的情况,那么跟着一下操作进行修改模版

    点击File中的Settings设置 

    点击Editor,找到File and Code Templates,在右侧面板中找到Other,找到Web点击后Java code templates,找到Servlet Annotated Class.java 

     把以下代码放入到模版框内

    1. #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
    2. #parse("File Header.java")
    3. @javax.servlet.annotation.WebServlet(urlPatterns="/${Entity_Name}")
    4. public class ${Class_Name} extends javax.servlet.http.HttpServlet {
    5. protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
    6. }
    7. protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
    8. this.doPost(request,response);
    9. }
    10. }

    3、项目部署位置(面试题)

    我们思考一个问题,tomcat里面如何部署一个项目,肯定是放在了tomcat里面的webapps,那我们去项目中找一下

    发现并没有项目的包,那么就很疑惑,没有放到tomcat的webapps中,项目是怎么在tomcat中跑起来的呢?

    其实真正的项目是在C:\Users\Administrator\.IntelliJIdea2018.3\system\tomcat\Tomcat_9_0_54_day02_servlet\conf\Catalina\localhost\ROOT.xml

    context标签中的docBase的作用就是从此路径寻找项目 

    可以看到,打开这个路径,找到了我们项目写的web下的页面

    然而java代码就被放在了WEB-INF的classes包中

     

    4、绝对路径和相对路径

    4.1、绝对路径

    在html里,我们需要通过form表单请求到后台,action中的地址就是我们发送请求到的servlet地址,这里可以使用绝对地址,顾名思义,就是整个地址都得写上

    1. <form action="http://localhost:8081/ServletDemo" method="post">
    2. form>

    4.2、相对路径

    相对路径就只用写上servlet中的请求路径

    1. <form action="/ServletDemo" method="post">
    2. form>

    5、ServletConfig和ServletContext

    5.1、ServletConfig

    servletConfig 是一个对象。javaee规范中定义的一个对象。要求web服务器(tomcat),创建一个servlet的同时,也要去创建一个servletConfig对象。还要给servlet去使用。

    serlvetConfig 是我们servlet 一些的配置信息。如果一个servlet 使用的过程中需要一些参数信息。这些参数信息,可以配置到servletConfig中。 之后servlet去使用。

    1. <servlet>
    2. <servlet-name>ServletConfig01servlet-name>
    3. <servlet-class>cn.itssl.config.ServletConfig01servlet-class>
    4. <init-param>
    5. <param-name>charsetparam-name>
    6. <param-value>utf-8param-value>
    7. init-param>
    8. servlet>
    9. <servlet-mapping>
    10. <servlet-name>ServletConfig01servlet-name>
    11. <url-pattern>/ServletConfig01url-pattern>
    12. servlet-mapping>

    原生配置xml方式 

    1. public class ServletConfig01 implements Servlet {
    2. @Override
    3. public void init(ServletConfig servletConfig) throws ServletException {
    4. //通过servletConfig对象获取到web.xml下配置的参数内容
    5. String charset = servletConfig.getInitParameter("charset");
    6. System.out.println(charset);
    7. }
    8. @Override
    9. public ServletConfig getServletConfig() {
    10. return null;
    11. }
    12. @Override
    13. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    14. }
    15. @Override
    16. public String getServletInfo() {
    17. return null;
    18. }
    19. @Override
    20. public void destroy() {
    21. }
    22. }

    通过注解形式 

    1. @WebServlet(urlPatterns = "/ServletConfig02", initParams = {@WebInitParam(name = "charset", value = "utf-8"), @WebInitParam(name = "charset2", value = "GBK")})
    2. public class ServletConfig02 extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. String charset = this.getServletConfig().getInitParameter("charset");
    5. response.setContentType("text/html;charset="+charset);
    6. //如果不设置字符集在页面会出现乱码
    7. response.getWriter().write("我爱你中国");
    8. }
    9. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    10. this.doPost(request, response);
    11. }
    12. }

    5.2、ServletContext

    在ServletConfig对象中可以看出该对象只能为当前servlet进行参数赋值,也就是说每一个servlet的参数都是独立的,如果以后有上百个servlet都要为其赋值charset字符集,那么重复的设置是很繁琐的,所以ServletContext就可以解决这个问题,它是全局设置参数。

    ServletContext是整个web项目应用程序运行后的代表对象。(代表当前一个项目)可以通过ServletConfig的getServletContext() 的方法得到,然后可以用该对象取得整个应用程序的相关资源或者信息。

    1. <context-param>
    2. <param-name>charsetparam-name>
    3. <param-value>utf-8param-value>
    4. context-param>
    1. @WebServlet(urlPatterns = "/ServletContext01")
    2. public class ServletContext01 extends HttpServlet {
    3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4. String charset = this.getServletContext().getInitParameter("charset");
    5. response.setContentType("text/html;charset="+charset);
    6. response.getWriter().write("我爱你中国");
    7. }
    8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    9. this.doPost(request, response);
    10. }
    11. }

    5.3、两者区别

    ServletConfig:
        一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet
        有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
    ServletContext:
        对任何servlet,任何人在任何时间都有效,等于是全局的对象。

  • 相关阅读:
    一条通往服务器所有端口的隧道
    新闻速递 | MobTech袤博科技参与中国信通院“绿色SDK产业生态共建行动”
    cmd/python命令行密钥上传SFTP,实现自动化上传
    【Godot4自学手册】第二十节增加游戏的打击感,镜头震颤、冻结帧和死亡特效
    JWT快速上手 | 黑马
    PDF格式分析(七十五)——线型注释(Line)
    关于vue混入(mixin)的解读
    彻底掌握Makefile(一)
    2023年【起重机械指挥】考试题库及起重机械指挥证考试
    安装JDK(不同环境下都有)
  • 原文地址:https://blog.csdn.net/select_myname/article/details/126854736