如何编写一个Servlet?(JavaWeb学习笔记-Servlet开发的常用技巧)

如何编写一个Servlet?(JavaWeb学习笔记-Servlet开发的常用技巧),第1张

如何编写一个Servlet?(JavaWeb学习笔记-Servlet开发的常用技巧)

文章目录
  • How to develop servlets?
      • 前言:
      • 如何给Servlet映射一个地址?
      • 如何请求一个Servlet?
          • 1.通过HTTP GET请求Servlet
          • 2.通过HTTP POST请求Servlet
            • GET与POST的使用场景:
      • Servlet的一些常用方法
          • 如何获取客户端传递的参数?
          • 如何存取Attribute(属性)?
          • 如何将request对象转发?
            • 请求转发:
            • 重定向:
      • 怎样配置web.xml?
      • Servlet的基本工作原理


How to develop servlets? 前言:

首先给出一个实现用户注册功能的Servlet示例:

package com.example.demoboard;

import com.example.demoboard.JavaBean.UserBean;
import com.example.demoboard.useBean.UserDB;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "registerServlet", value = "/register-servlet")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        System.out.println("ta点了注册!");
        String username = request.getParameter("username");
        String password = request.getParameter("password_1");
        UserBean user = new UserBean(username, password);
        UserDB.insert(user);
    }
}

UserDB.insert(user);这一段是关于数据库的内容,暂且不管。

其中doGet(),doPost()是继承了HttpServlet以后需要我们自己实现的方法,request,response是常用的两个对象,除此之外HttpServlet自带的一些方法可以通过this.func()的方式调用。具体内容下面会逐一给出。


如何给Servlet映射一个地址?

How to create and map a servlet?

浏览器是不能直接访问Servlet的,需要通过映射的方式间接访问Servlet。同时一个Web项目通常会有多个Servlet供Tomcat调用,那么如何创建Servlet的对应关系呢?我们需要先给Servlet配置一个地址,通过这个地址再来访问Servlet。映射的配置方式有两种:1.注解,2.修改web.xml。

  • 通过注解(map a servlet with an annotation)

    package com.example.webstudy;
    
    import java.io.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    
    @WebServlet(name = "helloServlet", value = "/hello-servlet")
    public class HelloServlet extends HttpServlet {
        private String message;
    
        public void init() {
            message = "Hello World!";
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.setContentType("text/html");
    
            // Hello
            PrintWriter out = response.getWriter();
            out.println("");
            out.println("" + message + "");
            out.println("");
        }
    
        public void destroy() {
        }
    }
    

    这是IDEA在创建Web项目时为我们准备的例子,其中@WebServlet(name = "helloServlet", value = "/hello-servlet") 即为配置Servlet映射的注解,Servlet的名字为helloServlet,与它对应的地址是/hello-servlet 。

    *tips:*注解也可以写成@webServlet("/hello-servlet")跟上面是一样的效果。

  • 修改web.xml文件(map a servlet with the web.xml file)

    
        helloServlet
        com.example.webstudy
    
    
    
        helloServlet
        /hello-servlet
    
    

    通过修改xml文件的方式需要指定Servlet所在的包名(package),com.example.webstudy 中填写要给Servlet映射的地址。


如何请求一个Servlet?

How to request a servlet?

给Servlet配置了地址以后,我们有两种方式请求Servlet:

  1. HTTP GET request
  2. HTTP POST request

HttpServlet在接收到客户端发来的请求以后,会根据请求的方式将其转交给对应的方法来处理。GET请求交给doGet()方法,POST请求交给doPost()方法。

1.通过HTTP GET请求Servlet

How to use the HTTP GET method?

可以简单理解为在客户端通过url请求Servlet,并传递参数,这种统称为GET方式。

比如我可以直接在浏览器中输入url:http://localhost:8080/webstudy_war_exploded/hello-servlet?user=admin ,可以直接访问到/hello-servlet所对应的Servlet,同时将?后面的内容以键值对(key-value)的形式传给Servlet中的doGet()方法。

  • 如何在url后面添加一些参数?

    How to append parameters to a URL?

    一个参数:/hello-servlet?name=admin

    多个参数:/hello-servlet?name=admin&password=123456

  • 如何以GET方式请求Servlet并传递参数?

    How to append parameters to a GET request?

    1. 在浏览器地址栏中输入URL

      Enter the URL into the browser’s address bar

      http://localhost:8080/webstudy_war_exploded/hello-servlet?user=admin&password=123456

    2. HTML中的表单,将method属性设置为get

      Code a form that uses the GET method

      
          
          
      
      
      
    3. 在超链接中

      Code an anchor tag

      goto helloServlet
      
2.通过HTTP POST请求Servlet

How to use the HTTP POST method?

POST请求可以在Form表单中定义,与GET方式的区别是GET请求会把传递的参数展示在浏览器的地址栏中,而POST不会,相比之下POST方式更加安全。

  • HTML中的表单,将method属性设置为post

    A Form tag that uses the POST method

    
        
        
    
    
GET与POST的使用场景: 使用get method的情况使用post method的情况HTML表单的内容比较少发送更大的数据(>4KB)做数据查询时做数据的增加,修改,删除时获取资源,读取数据时要求的安全性表较高时
Servlet的一些常用方法

Skills for working with servlets

在实际的Web开发中我们不需要自己实现Servlet,而是继承HttpServlet,它帮我们实现了Servlet并屏蔽了一些不常用的方法,我们只需要完成其中的doGet()与doPost()方法即可。

其中request对象与response是HttpServletRequest与HttpServletResponse的对象,它们是最常用的两个对象,里面有很多常用的方法。为了使用它们,我们在实现doGet(),doPost()方法时要将它们作为参数传给这两个方法。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    ...
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    ...
}
  1. request对象:获取客户端数据。
  2. response对象:响应客户端数据,向客户端发送数据。
如何获取客户端传递的参数?

How to get the values of the parameters?

我们通过GET或者POST方式请求了Servlet并传递了key-value型的数据,那么如何得到它呢?

  • 一个key对应一个value时:

    假设以GET方式请求Servlet:http://localhost:8080/webstudy/hello-servlet?user=admin。

    String username = request.getParameter("user");
    
  • 一个key对应多个value时(比如一个多选的Form表单):

    假设在HTML页面中定义一个复选框,以POST方式请求Servlet。

     
    

    在demo-servlet,可以通过下面的方法获取一组值。

    String[] fruits = request.getParameterValues("Fruit");
    
如何存取Attribute(属性)?

How to get and set request attributes?

Attribute是服务器端的组件,当我们想要保存某个对象的时候可以使用setAttribute()方法,将其保存在request对象中,取得已保存的对象可以使用getAttribute()方法。

  • 以key-value的形式存取对象。

    User user = new User(username, password);
    request.setAttribute("user1", user);
    
    //	返回的是Object类,需要cast
    User user = (User) request.getAttribute("user1");
    
  • setAttribute()只能保存对象,如果要保存基本类型的数据,应该使用它们的包装类。

    int id = 1;
    request.setAttribute("id", new Interger(id));
    
    //	同样需要cast,同时Interger会自动拆箱,将数值赋值给id
    int id = (Interger) requset.getAttribute("id");
    
如何将request对象转发?

How to forward requsets?

请求转发:

我们已经在request里存了一些对象,如何在其他地方得到它们呢?

可以使用转发的方式,将request转发到其他地方。

  • 转发给网页

    String url = "/demo.jsp";
    request.getServletContext.getRequestDispatcher(url).forward(request, response);
    
  • 转发给其他Servlet

    String url = "/webstudy/hello-servlet";
    request.getServletContext.getRequestDispatcher(url);
    
重定向:

重定向仅仅会使浏览器跳转到其他地方,而不会将request对象转发,属于response对象的方法。

  • 重定向到其他Servlet

    response.sendRedirect("/hello-servlet");
    
  • 重定向值某个网页

    response.sendRedirect("/demo.jsp");
    

怎样配置web.xml?

How to work with the web.xml file?

前文提到通过修改web.xml的方式可以配置Servlet的映射地址,除此之外,你还可以:

  • 配置初始参数(key-value)

    • 对所有Servlet生效

      
          username
          Zhang san
      
      

      在Servlet中取得初始参数:

      //	对全局生效,使用ServletContext
      String username = this.getServletContext().getInitParameter("username");
      
    • 对特定的Servlet生效

      
          HelloServlet
          com.webstudy.HelloServlet
          
              username
              Zhang san
          
      
      

      在Servlet中取得初始参数:

      //	对特定servlet生效,使用ServletConfig
      String username = this.getServletConfig().getInitParameter("username");
      
  • 设置欢迎页(默认主页,会从配置的第一个页面开始寻找)

    
        Demo.html
        index.jsp
    
    
  • 设置错误页面

    
        404
        /error_404.html
    
    

Servlet的基本工作原理

How the method of a servlet work?

  • HttpServlet

    在编写Servlet应用程序时,大多数都要用到HTTP,也就是说可以利用HTTP提供的特性,javax.servlet.http包含了编写Servlet应用程序的类和接口,其中很多覆盖了javax.servlet中的类型,我们自己在编写应用时大多时候也是继承的HttpServlet。

当Web服务器接收到一个HTTP请求时,它会先判断请求内容——如果是静态网页数据,Web服务器将会自行处理,然后产生响应信息;如果牵涉到动态数据,Web服务器会将请求转交给Servlet容器。此时Servlet容器会找到对应的处理该请求的Servlet实例来处理,结果会送回Web服务器,再由Web服务器传回用户端。

针对同一个Servlet,Servlet容器会在第一次收到http请求时建立一个Servlet实例,然后启动一个线程。第二次收到http请求时,Servlet容器无须建立相同的Servlet实例,而是启动第二个线程来服务客户端请求。所以多线程方式不但可以提高Web应用程序的执行效率,也可以降低Web服务器的系统负担。

(来源:简书-理解Servlet工作原理 - 简书 )

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5691061.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存