servlet相关笔记(web.xml基础配置)

本文详细介绍了Java Web开发中的三大核心组件:Servlet、Filter及Listener的基本配置与使用方法,并对比了forward与redirect的区别。

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

1、servlet
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.csdn.servlet.LoginServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

a)一对好基友,<servlet>标签注册了一个servlet,并标明了该servlet所在的路径,
<servlet-mapping>标签则指明了什么样的请求该由这个servlet来处理,如上说明该servlet处理host:8080/login这个请求
b)如果有多个servlet-mapping的情况下匹配的优先级问题:
精准匹配/add/a/b 1
最长匹配/add/* 2
后缀匹配*.do 3
默认匹配/ 4
host:端口/add/a/b 匹配1,host:端口/add/a 匹配2,host:端口/ssss/aaa/ddd.do 匹配3,host:端口/a/b/c/d匹配4
c)配置多个servlet时的加载顺序,<load-on-stratup></load-on-startup>数字越小的优先加载。负数表示延时加载,第一次用到该servlet之前才加载。

2、 Filter
    <filter>
        <filter-name>loginfilter</filter-name>
        <filter-class>com.csdn.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>loginfilter</filter-name>
            <!--这里是对某种类型的请求注册过滤器,
            还可以这样写<url-servlet>LoginServlet</url-servlet>就是为某个servlet注册过滤器
        -->
        <url-pattern>/login</url-pattern>
    </filter-mapping>

当web.xml配置了多个Filter的时候,Filter的加载顺序和<url-pattern>标签出现的顺序相同,即此标签出现的顺序决定了Filter的加载顺序
过滤器配置与servlet类似,如下是一个Filter的简单实现:

package com.csdn.Filter;

import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by zhang on 2016/12/11.
 * 实现javax.servlet.Filter接口
 * 重写三个方法 init(),doFilter(),destory()
 *
 * 
 *  主要用到的方法是doFilter()方法
 */
public class AFilter implements Filter {

    //初始化Filter的时候做的一些事情
    public void init(FilterConfig filterConfig) throws ServletException {}

    /**
     * 这里主要就是在请求到达对应的servlet之前判断一下客户端的cookie
     * 如果之前访问过该页面就会相应的有一个key为‘a' value为之前的访问次数的cookie
     * 如果之前没有访问过就增加一个这样的cookie
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest) servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;
        Cookie[] cookies = req.getCookies();
       if(cookies!=null){
           boolean a=false;
           for(Cookie cookie:cookies){
               if(cookie.getName().equals("a")){
                   a=true;
                   cookie.setValue(String.valueOf(Integer.parseInt(cookie.getValue())+1));
                   //将修改过的cookie放到response中,否则修改无效
                   resp.addCookie(cookie);
               }
           }
           if(!a){
               Cookie cookie=new Cookie("a",1+"");
               resp.addCookie(cookie);
           }
       }
       //将request、response沿着这个传输链传递下去,此条语句将请求传递到下一个Filter没有Filter了则传递给servlet
       filterChain.doFilter(req,resp);
       /**servlet是传输的终点,servlet处理完请求后会将request和response原路返回
        *此处如果有代码是在servlet处理完返回时才会执行
        */
        //doSomething();
    }
    //销毁destroy的时候做的一些事情
    public void destroy() {

    }
}

整个传输流程如下图所示(盗图)
这里写图片描述

3、 listener

实现 EventListener接口,事件监听器的接口,在事件发生时或者结束时做出相应的响应。没有具体用到过
待更新…

4、forward与redirect

a)转发request.getRequestDispatcher(“页面”).forward(request,response),客户端地址栏不改变,两个页面之间可以通过request.setAttribute(String name),request.getAttribute(String name)传值。转发发生在服务器端客户端并不参与
b)request.getParameter(String name),用于服务器获取客户端的数据,如客户端页面表单的数据
c)response.getWriter.print(String value)可以在响应页面打印数据。
d)重定向response.sendRedirect("页面"),客户端地址栏会改变。相当于客户端发了两次请求。

第一次客户端发请求request1给服务器
服务器接到request1 ,处理后发送response1告诉客户端完成这个请求需要重定向
客户端接到如上的response1后自动发送第二次request2
服务器接到request2,处理,然后发送response2

讲到这里可能有的朋友对Http请求和响应还不是很清楚,
其实request远不是一个URL这么简单,
request分为三部分:Request line,Request header,body
response也是:Response line,Request header,body
这里不详细介绍,有时间来详细总结一下
我们来看一个具体的例子,我请求一个http://www.baidu.com的Request header:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Cookie://一堆cookie
Host:www.baidu.com
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36
5、cookie

cookie是一个键值对
Cookie c=new Cookie(String a,String b)创建一个Cookie
response.add(cookie)将创建的cookie通过response保存到客户端,通过cookie.setValue(String value),修改某个cookie的值,修改完成后要add到response才能保存到客户端
Cookie [] cookies=reqest.getCookies();得到客户端的Cookies

注:以上全部讲解基于java语言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值