知识整理——Servlet

本文介绍三层架构原理及其在Servlet中的应用,包括Servlet的工作原理、生命周期、请求处理方式及与JSP的关系。同时探讨了Servlet的容器如request、session和application的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0,三层架构:
单一职责原则,职责和功能分离开,实现高内聚、低耦合。

web:接受数据,封装成bean,传输数据,返回响应
service:处理业务逻辑
dao:与数据库交互

优点:
    1,开发人员只关注某一个层面
    2,很容易的用新的实现来替换原有层次的实现,降低层与层之间的依赖
    3,利于标准化
    4,各层逻辑复用
    5,结构更加明确
    6,便于维护

缺点:
    1,降低系统性能
    2,导致级联修改
    3,增加成本(开发时间和人员增加)
1,Tomcat
目录
bin :存放可执行文件    
conf :存放配置文件
lib :存放jar包
logs :存放日志
temp :存放临时文件
webapps :存放web项目
work :存放jsp转换成html的中间产物
2,什么是Servlet
1,用Java编写的服务器端程序。
2,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
3,狭义的Servlet是指Java语言实现的一个接口,
4,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
5,Servlet运行于支持Java的应用服务器中。
6,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

JSP概念
Servlet是j2ee提供的动态资源开发技术,是以java的程序的形式进行开发,在java中书写HTML标签是一件十分头疼的事情,所以人们开发出了JSP,看起来像是HTML一样,但是通过服务器的编译最终可以生成Servlet,jsp页面其实就是一个servlet。
动态网页技术
jsp页面翻译成.java,然后再编译成.class,最后再运行这个.class文件
jsp = html + java

jsp页面其实就是一个servlet
servlet能做的事情jsp全能做。
servlet和jsp需要部署在服务器上才能运行。
servlet和jsp不需要写main方法运行。
浏览器只能打开html,需要通过服务器Tomcat将java转换成html,才能打开。

3,Servlet的作用:

可以让服务器调用处理请求的类。

4,一个类变成Servlet的方法:
1,实现一个Servlet接口

    service(ServletRequestreq,ServletResponse res); 处理请求的方法。
    destroy(); 销毁
    getServletConfig();返回ServletConfig 对象。
    getServletInfo();返回Servlet对象的信息。
    init(ServletConfig config);初始化。

2,继承一个抽象类HttpServlet

    public class ServletName extends HttpServlet { 
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} 
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} 
} 
**5,servlet的生命周期:
servlet创建、初始化只一次(因为单例),执行多次

销毁:正常关闭服务器
     重新部署

servlet的对象是单例:
    在web项目整个运行期间,每一个servlet类只会有一个对象存在。

1,创建 :(默认情况)servlet第一次被访问的时候创建
2,初始化 : 创建以后立刻初始化,调用init(ServletConfig config)
3,执行 : 每次被访问的时候都会调用service(ServletRequest req,ServletResponse res);
4,销毁 : 正常关闭服务器,服务器自动重新部署,手动重新部署服务器的时候会调用destroy()进行销毁。

由于对象单例,可能产生多线程安全问题,解决办法:

    1,减少成员变量的使用
    2,加锁synchronized
    3,使用安全性接口

6,客户端向服务器发请求和传参,客户端向服务器发送请求可以是get方式也可以是post方式.所以传参也分为get方式下传参和post方式下传参。

    1,get方式下传参:

    a.浏览器中输入地址(URL)然后回车
    b.超链接 <a href="param?name=haha&age=20"></a>
    c.页面中引入的css样式文件
    d.页面中引入的js的文件(javascript)
    e.<img src="image/a.jpg" />

    e.<img src="register" />

    f.form表单中method="get"
    g.ajax中可以设置异步提交请求的方式为get

    2,post方式下传参:

    a.form表单中method="post"
    b.ajax中可以设置异步提交请求的方式为post

get/post区别:主要体现在所传参数上面
    get方式传参的特点:
        1.参数直接放在url后面。
        2.从浏览器的地址栏里面可以直接看到所传的参数。
        3.参数的长度有限制,不能把一个很长的数据通过get方式传参。(与浏览器种类有关)       
    post方式传参的特点:
        1.参数放在请求体部。
        2.浏览器的地址栏中看不到所传的参数。
        3.因为参数不用出现在地址栏里面,所有参数长度是没有限制的。
7,servlet中接收客户端传过来的参数:
form: action="/url" input标签中 获取 key-value
 a  : href="/url?key1=value&key2=value"
8,
请求发送的过程 
    浏览器-->tomcat服务器-->web.xml-->servlet.java-->代码

响应的过程
    代码-->servlet.java-->服务器-->浏览器
9,servlet中的跳转:
1,服务器内部跳转:

    RequestDispatcher rd =req.getRequestDispatcher(page).forward(req, resp); 

    跳转:
        rd.forward(req, resp);
            把前一个servlet的out输出流数据刷新
        rd.include(req, resp);
            不会刷新

    特点:
    1.浏览器地址不变
    2.请求链不断开
    3.request,response对象都是同一个。

2,客户端重定向:

    resp.sendRedirect(page);

    特点:
    1.地址栏数据会发生改变
    2.请求链断开,相当于重新发送请求
    3.request,response对象都是浏览器新发出的
10,servlet的三大容器:request、session、application
在多个servlet中进行数据的传递。(用容器只能传到jsp页面)

request :HttpServletRequest

    一次请求=请求+响应
    生命周期太短

session : HttpSession(可能线程不安全)

    一次会话=多次请求
    获取: request.getSession(); 

    钝化:当服务器正常关闭,但session没有到正常死亡时间,会写到文件中
    活化:服务器启动,会加载work下的.sess文件,把文件中的session对象加载到服务器中

    cookie:
        保存用户访问的信息数据,因为http协议的访问是无状态访问,不会保存访问的记录。

    session和cookie区别:

        session是保存在服务器端的一个对象,客户端没有。
        cookie在客户端是以本地文件的形式存在的,在服务器端是以java对象的形式存在。
        session是把数据保存在服务器端的内存里面。
        cookie是把数据保存在客户端的文件里面。
        session在多个servlet中进行数据的传递
        cookie保存用户访问的信息数据


application :ServletContext(可能线程不安全)

    所有页面
    获取:session.getServletContext();
11,Filter(过滤器) : 拦截请求
编码的转换
信息的过滤
权限的判断
登录的验证

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.briup.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
12,监听器(Listener) :监听web中的一些事件的发生,如果事件发生,这个监听器就会调用某些方法处理.
如何去写一个监听器:
    1.实现一个接口。
    2.在web.xml文件中进行配置。
<listener>
    <listener-class>com.briup.listener.RequestListener</listener-class>
</listener>

Servlet API中定义了8个监听器接口,可以用于监听ServletContext,HttpSession,ServletRequest对象的生命周期事件。
ServletContextListener      监听Servlet上下文对象初始化或者被销毁
ServletContextAttributeListener 监听Servlet上下文中的属性列表的变化

HttpSessionListener         监听Session生命周期
HttpSessionActionListener   监听session被钝化或者激活(活化)
HttpSessionAttributeListener监听Session属性列表发生的变化
HttpSessionBindingListener  监听Session中是否有对象绑定或者删除,该对象要实现这个接口//只有这个是该对象实现,其他的都是先写监听器的实现类


ServletRequestListener      监听ServletRequest对象声明周期
ServletRequestAttributeListener 监听ServletRequest属性列表发生的变化
### Java Web 开发的核心概念 #### Servlet 和 JSP Servlet 是服务器端的小型 Java 程序,用于处理客户端请求并返回响应。通过实现特定接口或继承抽象来创建自定义的 Servlet 实现[^2]。 JavaServer Pages (JSP) 提供了一种简化的方式编写动态网页内容的方法。它允许嵌入 HTML 中的 Java 代码片段,从而可以轻松生成基于浏览器显示的数据驱动页面。 ```java // 创建一个简单的 Servlet @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>Hello from Servlet!</h1>"); out.println("</body></html>"); } } ``` #### Filter 和 Listener 除了 Servlet 外,Java Web 还引入了另外两个重要组件——过滤器(Filter)和监听器(Listener),它们共同构成了所谓的“三大件”。Filter 可以拦截 HTTP 请求/响应链中的数据流;而 Listener 则负责监控某些事件的发生,比如应用程序启动或会话创建等时刻的状态变化[^4]。 ```xml <!-- 配置 web.xml 文件 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <listener> <listener-class>com.example.MyContextLoaderListener</listener-class> </listener> ``` ### 常用技术点 #### Spring 框架 作为最流行的 Java EE 平台之一,Spring 主要应用于开发企业级应用和服务。该框架不仅提供了依赖注入(Dependency Injection)功能来管理对象之间的协作关系,还包含了众多模块化设计的服务层解决方案,如事务管理和安全控制等功能[^3]。 ```yaml # application.yml 示例配置文件 server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC username: root password: secret ``` #### Hibernate ORM 工具 为了更方便地操作数据库表结构以及执行查询语句,开发者通常会选择使用像 Hibernate 这样的持久层框架。这种工具能够自动映射实体到对应的表格记录,并支持复杂的关联关系建模。 ```java @Entity @Table(name="users") public class User { @Id private Long id; @Column(nullable=false) private String name; // getters and setters... } ``` Java 的跨平台性和丰富的生态系统使其成为构建高效可靠的 Web 应用的理想选择。无论是小型项目还是大型分布式系统,都可以找到适合的技术栈组合来满足需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

原来是你哇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值