Servlet基础

servlets是什么

面向百度编程

  • 是一个小服务程序或服务连接器,
  • Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
  1. 客户端发送请求至服务器端;
  2. 服务器将请求信息发送至 Servlet;
  3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
  4. 服务器将响应返回给客户端。
  • 用自己的理解说,就是一种嵌在服务器里的魔法工具,服务器(Tomcat)给它原料和要求,它相应的给出结果

画图解释

这里浅浅画一下
在这里插入图片描述
先大概了解一下了,下面具体操作,在实践中出真知

具体怎么用servlet

  • 先在idea中新建项目,Java Enterprise 并在右侧界面的模板中选择 Web应用程序,这样会自动配置好 servlet和其他依赖,下面的com.example中example也可以更改。

准备工作(建controller和service层)

  • 然后我们需要在相应地方新建controller 和 service 两个包,见图:
    在这里插入图片描述
  • 因为:
    MVC思想,也就是模型-界面-控制器思想,参看下面一篇文章,有图形解释
    servlet和mvc
  • 具体一些:
    servlet层中的servlet类会调用service层的方法,
    service层又通过dao层访问数据库
    我们需要将这三层用三个包表示
    在这里,servlet就是控制器,实现控制功能,所以我们之后的servlet类都会写在controller包里,相关方法可以写service包中,dao层先不涉及

Servlet映射路径

在servlet中写了第一个类(目的就是继承相应接口,实现相应方法)后,我们要关注它的映射路径(要不汤姆猫怎么知道到底要用哪个魔法器件 servlet1 ? servlet2? 还是 servlet3?)
两种方法

  1. 直接在类前用 @WebServlet 注解表示
    在这里插入图片描述
    我让LoginServlet这个魔法器件的对应识别路径是 /login
  2. 在web.xml中 手动设置
    在这里插入图片描述
    配置的框架就是上面这样:
    login 当作中间商连接了 LoginServlet类和路径/login,上面直接设置映射的方法,就是去掉了中间商,更简洁方便

jsp

  • 我们需要一个登录界面,填完信息提交后(发送请求),要进入一个登陆成功的界面,这两个界面,
  • 于是新建 login.jsp 用做前者(我是在webapp中建的),并用默认界面index.jsp 做后者
    在这里插入图片描述
    两个界面只要有基础的html和跳转路径即可
  • 输入网址(xxx/login)进入登录界面(在LoginServlet类中doGet方法中实现)
  • 登录界面 提交后 再跳至 /login,一般用post方法
  • 此时,于是在/login 对应类,即LoginServlet 中实现doPost方法,对登陆界面的请求做出相应处理,给出响应,我们这里的响应是跳到登陆成功的界面(在DoPost方法中 设置跳转至 index.jsp)
  • 总结:
    LoginServlet实现从login.jsp到index.jsp的跳转,这里我们要写的就是这个类和两个界面,并设置类的映射

Servlet基础知识

相关接口

servlet的接口及实现类

Servlet接口

最核心的接口,
init()
service()
destroy()
getServletConfig()
getServletInfo()
前三个 很重要!

GenericServlet 抽象类

继承Servlet,唯独没有实现service方法

HttpServlet 类

继承GenericServlet,实现了service方法,具体有DoGet,DoPost等方法,一般写Servlet类都继承此类,按需求重写service方法,或单单地重写DoGet,DoPost

生命周期

一个魔法器件从魔法仓库中拿来到放回,是它的一个生命周期,其中有三个重要方法

init()

加载到服务器后,进行初始化,只在第一次使用时调用(当然,你得等到整个工程结束了再把工具放回去吧)

service()

只要有相应请求,则调用

destroy()

同init()一样,只在关闭项目或服务器时调用一次

有很多这种测试例子,读者可自行查找

resquest和response对象及可调用方法

  • 汤姆猫会在 收到请求后,将请求包装成一个对象request
    并最后同样给出包装好的response对象
    于是在魔法器件servlet实现各种方法时可以调用对象中的方法来协助工作,
  • 下面是LoginServlet类的代码
package com.kikky.javalogin.controller;

import com.kikky.javalogin.service.LoginService;

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

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/Login.jsp").forward(req,resp);
        System.out.println("已转发至Login.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        new LoginService().test(username,password);

        req.getSession().setAttribute("username", username);
        String path = req.getContextPath();
        resp.sendRedirect(path + "/index.jsp");
        System.out.println("已重定向至index.jsp");
    }


}

  • 在代码中我们看到有
  1. HttpServletRequest req
    HttpServletResponse resp
    两个对象
  2. req.getRequestDispatcher 转发
    resp.sendRedirect 重定向
  3. req.getParameter 获取请求对象的参数,如用户登录的姓名、密码等
  4. req.getSession() 相当于得到一个session对象,而void setAttribute()和String Attribute分别是对属性赋值和得到属性值的方法。
  5. req.getContextPath() 获取当前在Tomcat上部署的路径,可查看和更改路径名称 (右上角Tomcat编辑配置–>部署–>应用程序上下文中 更改)

转发和重定向

个人初始肤浅理解:
转发 是呈现转发的界面,但上方路径不更改,请求一次
而重定向是自动再次发送一个请求,界面和路径都更改,请求两次

这是一篇博文总结,可供参考
转发和重定向

博文中的总结

  1. 转发的地址栏不变,而重定向变成转发后的资源。
  2. 转发是一次请求,而重定向是两次请求。所以一般可以说重定向是2次转发。
  3. 转发只能在自己内部服务器资源内相互转发,而重定向可以访问其他站点。”

总结

理解 tomcat 和 servlet 的 各自功能和关系
之前看过一篇博文,就是这样比喻的,类似于tomcat是家,servlet是机器吧,形象
实践出真知 + 学与思结合吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值