Servlet快速入门

Servlet

一.Servlet介绍

Servlet是运行在服务器上的程序,接收客户端的请求,并做出响应

二.编写Servlet程序

1.创建web项目

点击创建01

02

如果main目录下没有java文件夹,需要手动创建java文件夹

2.引入依赖

  <dependencies>
        <!-- 引入servlet依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- 引入jsp依赖 -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>

3.编写Servlet

  1. 不推荐使用实现接口的方式,需要实现的方法太多,有些在开发中是用不上的
  2. 推荐使用继承HttpServlet类的方式
  3. 重写doGet或doPost方法
    1. 浏览器发送get请求,就重写doGet方法
    2. 浏览器发送post请求,就重写doPost方法
  4. 在doGet方法或doPost方法中编写响应内容

4.配置Servlet和前端请求路径的映射

推荐使用注解的方式进行配置,使用WebServlet注解

完整代码

@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("第一个Servlet程序");
        // 响应成功后跳转的页面
        resp.sendRedirect("/ok.jsp");
    }
}

5.部署

idea整合Tomcat

点击右上的Current File

03

点击左上角的加号,选择Tomcat Server,如果使用自己本机的Tomcat就选择Local

在Application Server中配置自己的Tomcat

在VM options中添加-Dfile.encoding=UTF-8,可以防止控制台输入Tomcat信息时中文乱码

image-20241109104540794

切换到Deployment选项卡中,点击+号,选择Artifact…

image-20241109104744508

选择自己的项目, 选第一个或者第二个

05

Application context中的内容最好删掉,否则浏览器访问的时候端口号之后必须带上里面的内容

06

点击OK,idea上方会显示服务器的信息

04

6.运行

点击上方的箭头

07

控制台会输出Tomcat启动信息

08

启动成功后会自动弹出浏览器

image-20241109105341218

此时在浏览器中输入访问路径 localhost:8080/hello

斜杠后的内容就是WebServlet注解中配置的内容

页面跳转到ok.jsp,说明响应成功

image-20241109105507025

7.其他

7.1主页设置

Servlet的主页默认是webapp目录下的index.jsp

可以在WEB-INF文件夹中的web.xml中自定义主页

添加welcome-file-list标签,在标签中添加welcome-file标签,标签中可以自定义主页

<!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>
  <display-name>Archetype Created Web Application</display-name>
  
  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
7.2Tomcat启动后不自动启动浏览器

在Tomcat配置页面中将After launch勾选去掉

image-20241109105944512

7.3 请求内容或响应内容中文乱码

使用HttpServletRequest中的setCharacterEncoding方法,参数写UTF-8

使用HttpServletResponse中的setContentType方法,参数写text/html;charset=utf-8

@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("第一个Servlet程序");
        
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        
        // 响应成功后跳转的页面
        resp.sendRedirect("/ok.jsp");
    }
}

三.请求转发和重定向

1.请求转发跳转页面

req.getRequestDispatcher("请求转发的与页面/Servlet请求名称").forward(req, resp);
@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("第一个Servlet程序");

        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        // 响应成功后跳转的页面
        req.getRequestDispatcher("/ok.jsp").forward(req, resp);
    }
}

getRequestDispatcher中既可以写跳转的页面,也可以写Servlet请求的名称

req.getRequestDispatcher("/show/user").forward(req, resp);

两个Servlet请求转发时,可以使用请求域传递数据

使用req.setAttribute(key,value),这样就可以将数据存储在请求对象

在另一个Servlet中使用req.getAttribute(key)接收数据

@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("第一个Servlet程序");

        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        // 使用请求域向另一个请求传递数据
        req.setAttribute("username", "Sigewinne");
        // 响应成功后跳转的页面
        req.getRequestDispatcher("user").forward(req, resp);
    }
}
@WebServlet("/user")
public class Demo02Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = (String) req.getAttribute("username");
        System.out.println("username = " + username);
    }
}

访问hello之后,user这个Servlet接收到了username这条数据

09

2.重定向

重定向也可以跳转Servlet,也可以跳转页面(功能和请求转发类似)

resp.sendRedirect("user");

上面的示例使用重定向完成

@WebServlet("/hello")
public class Demo01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("第一个Servlet程序");

        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        // 使用请求域向另一个请求传递数据
        req.setAttribute("username", "Sigewinne");
        // 响应成功后跳转的页面
        resp.sendRedirect("user");
    }
}
@WebServlet("/user")
public class Demo02Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = (String) req.getAttribute("username");
        System.out.println("username = " + username);
    }
}

执行结果

10

发现另一个请求并没有接收到数据

3.区别

  • 请求转发
    • 服务器端操作:请求转发是在服务器内完成的,客户端浏览器的地址栏不变
    • 一次请求:整个过程对客户端来说发起了一次请求
    • 可以传递数据:可以通过请求域向对方传递数据
    • 性能较高:因为是在服务器内部进行操作,所以效率较高
  • 重定向
    • 客户端操作:重定向是由服务器发送一个状态码(通常是302)和一个新的URL到客户端,客户端根据新的URL发起新的请求

    • 两次请求:客户端会看到两次请求,地址栏的URL会换成新的URL

    • 不可以传递数据:由于是客户端重新发起请求,所以不能和服务端共享数据

    • 性能较低:因为涉及到客户端的二次请求,所以性能较低

    • 一次请求:整个过程对客户端来说发起了一次请求

    • 可以传递数据:可以通过请求域向对方传递数据

    • 性能较高:因为是在服务器内部进行操作,所以效率较高

  • 重定向
    • 客户端操作:重定向是由服务器发送一个状态码(通常是302)和一个新的URL到客户端,客户端根据新的URL发起新的请求
    • 两次请求:客户端会看到两次请求,地址栏的URL会换成新的URL
    • 不可以传递数据:由于是客户端重新发起请求,所以不能和服务端共享数据
    • 性能较低:因为涉及到客户端的二次请求,所以性能较低
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值