JavaWeb(二)

一、Servlet原理

        (1)Servlet是使用Java语言编写的运行在服务器端的程序, 主要用于处理客户端传来的Http请求request,并返回一个响应response。狭义的Servlet是指一个接口,广义上的Servlet指的就是实现这个接口的任何类。一般情况下,我们说的Servlet指的就是后者。

        GenericServlet类实现了Servlet接口,HttpServlet类继承GenericServlet类,我们自己的类也继承自HttpServlet,并重写doGet()和doPost()方法

        (2) 浏览器向web容器(Tomcat服务器)发送Http请求,web容器会判断这个Http请求是不是第一次出现,如果是,web容器就会创建一个Servlet实例(因此在第一次发送Http请求时,响应一般会比较慢);如果不是,则会直接调用已经存在的Servlet。

        (3)发送完Http请求后,服务器会创建:一个代表请求的HttpServletRequest对象,用于封装浏览器的请求消息;一个代表响应的HttpServletResponse对象,用于封装响应消息,便于web容器读取。

image-20220511094641137

         (4)Servlet再调用service方法,从HttpServletrequest对象中读取请求数据, 把响应消息写入到HttpServletResponse对象中。最后web容器从HttpServletResponse中读取响应数据,并返回给浏览器。

 

二、helloServlet

        (1)创建一个没有模板的maven工程项目,然后在下面创建module

         (2)导入Java Servlet API 4.0.1

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

        导入servlet.jsp-api

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
</dependency>

        记得把scope(范围)删掉,删去后所有作用域下都能使用

        (3)配置tomcat 9 不要用10 ,因为上面导的两个jar包只能在tomcat 9里使用,把项目打包成helloservlet.war包发布

Application context是访问项目的路径,和URL后面一致

        (4)HelloServlet

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

//ctrl+鼠标左键能看源码
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter(); //响应流
        writer.println("hello servlet.class!!!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

为什么在HelloServlet中的dopost()方法中调用doget()方法?

        通常我们使用的都是doPost方法,你只要在servlet中让这两个方法互相调用就行了。
再把业务逻辑直接写在doGet方法中。servlet碰到doPost方法调用直接就会去调用doGet因为他们的参数都一样,避免代码重复使用。

        不一定谁一定要放在谁里面,doget方法里面可以调dopost,然后在dopost里面实现你的业务逻辑;或者在dopost里面调用doget,然后在doget里面实现业务逻辑,然后根据表单提交方式,选择调用不同的方法

        (5)web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <display-name>Archetype Created Web Application</display-name>
  <!--  为什么在web.xml中写servlet的映射?因为通过浏览器访问java代码,浏览器需要连接web服务器,-->
  <!--  所以要在web.xml中注册我们写的servlet类,并给一个浏览器能访问的路径-->
  <!--  注册servlet-->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
  </servlet>

  <!--  servlet的映射路径(也就是这个HelloServlet类的请求路径)-->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/helloservlet</url-pattern>
  </servlet-mapping>
</web-app>

        一定要把<web-app>改成下面这种形式,因为idea自动生成的xml版本过低,会导致不匹配

 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

        (6)index.jsp

<html>
<body>
<h2> show index.html</h2>
</body>
</html>

        (7)运行截图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Curt1s7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值