Java Servlet

B/S:浏览器/服务器。 浏览器通过网址来访问服务器

一、什么是Servlet

servlet 是运行在 Web 服务器中的小型 Java 程序(简单理解为:服务器端的小应用程序)。

作用:接收用户的请求,并对请求做出处理,处理结果响应给客户端

Servlet是JavaWeb的三大组件之一(servlet、过滤器、监听器),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

接收请求数据、处理请求、完成响应。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口

二、实现Servlet的三种方式

  • javax.servlet.Servlet接口
  • javax.servlet.GenericServlet类;implements Servlet  abstractor
  • javax.servlet.http.HttpServlet类;extends GenericServlet abstractor

示例Servlet接口:

ervlet.java
public interface Servlet {
    public void init(ServletConfig config) throws ServletException;
    public ServletConfig getServletConfig();
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;
    public String getServletInfo();
    public void destroy();
}

 

 三、servelt的生命周期

相关方法:

void init(ServletConfig); 出生(servlet被创建成功后执行的方法)

void service(ServletRequest,ServletResponse); 服务

void destroy();销毁

1、出生:

服务器会在Servlet第一次被访问时创建Servlet,或者是在服务器启动时创建Servlet。如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。

2、Servlet服务:

  当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。服务器接收到一次请求,就会调用service() 方法一次,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!

3、Servlet的离去:

Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。

示例:

public class HelloServlet implements Servlet {
    public void init(ServletConfig config) throws ServletException {
       System.out.println("Servlet被创建了!");
    }
    public ServletConfig getServletConfig() {return null;}
    public void destroy() {
       System.out.println("Servlet要离去了!");
    }
    public String getServletInfo() {return null;}
 
    public void service(ServletRequest req, ServletResponse res)
           throws ServletException, IOException {
       System.out.println("hello servlet!");
    }
}

四、servlet细节

1、Servlet与线程安全

因为servlet是单例的(100个人访问,访问都是同一个servlet)

因为一个类型的Servlet只有一个实例对象,那么就有可能会现时出一个Servlet同时处理多个请求,那么Servlet是否为线程安全的呢?答案是:“不是线程安全的”。这说明Servlet的工作效率很高,但也存在线程安全问题!

所以我们不应该在Servlet中随便创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。

2 让服务器在启动时就创建Servlet

默认情况下,服务器会在某个Servlet第一次收到请求时创建它。也可以在web.xml中对Servlet进行配置,使服务器启动时就创建Servlet

<servlet>
       <servlet-name>hello1</servlet-name>
       <servlet-class>cn.test.servlet.Hello1Servlet</servlet-class>
       <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>hello1</servlet-name>
       <url-pattern>/hello1</url-pattern>
    </servlet-mapping>
    <servlet>
       <servlet-name>hello2</servlet-name>
       <servlet-class>cn.test.servlet.Hello2Servlet</servlet-class>
       <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>hello2</servlet-name>
       <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    <servlet>
       <servlet-name>hello3</servlet-name>
       <servlet-class>cn.test.servlet.Hello3Servlet</servlet-class>
       <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
       <servlet-name>hello3</servlet-name>
       <url-pattern>/hello3</url-pattern>
    </servlet-mapping>

五、手动编写servlet

1、创建一个MyServlet继承HttpServlet,重写doGet和doPost方法,也就是看请求的方式是get还是post,然后用不同的处理方式来处理请求

2、在web.xml中配置MyServlet,为什么需要配置?让浏览器发出的请求知道到达哪个servlet,也就是让tomcat将封装好的request找到对应的servlet让其使用。

配置四个东西。               

配置之后,浏览器是如何通过我们配置的信息来找到对应的servlet的。            

按照步骤,首先浏览器通过http://localhost:8080/test01/MyServlet来找到web.xml中的url-pattern,这就是第一步,匹配到了url-pattern后,就会找到第二步servlet的名字MyServlet,知道了名字,就可以通过servlet-name找到第三步,到了第三步,也就能够知道servlet的位置了。然后到其中找到对应的处理方式进行处理。

3、实验,验证上面配置成功。         

            

4、利用向导新建MyServlet,右击项目,在new选项中有直接新建servlet的选项,配置MyServlet类中的信息             

5、配置web.xml中的servlet信息              

   

6、查看MyServle01类中的代码和web.xml,其中的配置跟手动的配置是一样的,只是用图形化界面,让我们更方便的创建servlet而产生的。

六、Servlet get和Servlet post的区别

 1、get方式的提交

         (1)get提交中请求参数以 ?username=admin&password=admin123 形式拼接在路径(url)的后面

         (2)不安全的提交方式

         (3)提交的参数个数是有限制的,get方式能提交的数据只能是文本,且大小不超过1024个字节

         (4)提交后调用的是doGet()方法处理

    2、post方式的提交

         (1)提交的请求参数是放在请求体中(http包的包体中)

         (2)相对安全的提交方式

         (3)参数个数没有限制的,post不仅可以提交文本还有二进制文件。

         (4)提交后调用的是doPost()方法处理除了用form表单提交指定为post方式则为post方式提交,其它均为get方式提交

七:重定向和转发

重定向(Redirect):

是指当浏览器请求一个URL时,服务器返回一个重定向指令,告诉浏览器地址已经变了,麻烦使用新的URL再重新发送新请求。

示例:

//已经编写了一个能处理/hello的HelloServlet,如果收到的路径为/hi,希望能重定向到/hello,可以再编
//写一个RedirectServlet


@WebServlet(urlPatterns = "/hi")
public class RedirectServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 构造重定向的路径:
        String name = req.getParameter("name");
        String redirectToUrl = "/hello" + (name == null ? "" : "?name=" + name);
        // 发送重定向响应:
        resp.sendRedirect(redirectToUrl);
    }
}

转发(Forward):

Forward是指内部转发。当一个Servlet处理请求的时候,它可以决定自己不继续处理,而是转发给另一个Servlet处理。

示例:

//已经编写了一个能处理/hello的HelloServlet,继续编写一个能处理/morning的ForwardServlet:


@WebServlet(urlPatterns = "/morning")
public class ForwardServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/hello").forward(req, resp);
    }
}

  • 12
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值