servlet基础

本文介绍了Servlet的基本概念、开发流程及请求处理机制。详细讲解了Servlet的生命周期、容器如何找到指定Servlet的过程,以及如何处理中文乱码等问题。

转自:http://blog.sina.com.cn/s/blog_6189ab480100j9rk.html

1.介绍Servlet的基本概念(***)
    (Servlet、Servlet容器、Servlet vs. CGI)——————图示
  1)它是由 java 编写的、服务端的小程序。相对而言,Applet和javaScript是客户端小程序。
  2)基于Http协议的,运行在web服务器内的。Servlet和CGI都是运行在Web服务器上,用来生成Web页面。
  3)没有 main 方法。是接受来自网络的请求(form表单,以及其他的请求),并对不同请求作出不同的响应。
  4)由容器管理和调用。这个web容器可以控制Servlet对象的生命周期,控制请求由Servlet对象处理。
  5)Web 服务器的辅助应用,处理特定的用户请求,并返回响应。
    web服务器,这里的服务器不是硬件概念,而是软件,常用的web服务器有 Tomcat,Jboss等
    Tomcat是一个用java语言编写的web服务器,所以需要有相应的java运行环境,也就是JVM,还要配置tomcat的具体路径。
  6)继承 java 的优点,与协议、平台无关

2.开发第一个Servlet应用(**)
    Web应用的结构
    开发一个Servlet应用的步骤
    1)建立 Web 应用目录(注意细节:各目录的位置、名称与包含的内容)
    2)编写 Java 代码,如:HelloWorld.java
      把生成的.class 文件放置到 WebRoot/WEB-INF/classes 目录下
    3)编写配置文件:web.xml
      放置到 WebRoot/WEB-INF/  目录下
    4)把整个 web 应用放到 %catalina_home%/webapps  //放到 tomcat的 webapps目录下

3.分析Servlet应用(***)
  1)Servlet的继承体系
    javax.servlet.Servlet接口 --> GenericServlet抽象类 --> HttpServlet  -->  自定义类
    所有的servlet都必须实现该接口    处理各种协议(包括http)   专职处理http协议  也可继承GenericServlet
  2)Servlet接口;GenericServlet抽象类;HttpServlet类
    Servlet接口(位置:javax.servlet.Servlet) 定义了特定的生命周期方法:
        init(ServletConfig config)
        service(HttpServletRequest request, HttpServletResponse response)
        destroy()
    GenericServlet implements Servlet
        实现了 init(ServletConfig config)、destroy()等方法;并提供了 init()方法。
        还实现了 ServletConfig 接口。由于这是抽象类,所以必须实现抽象方法:service()
    HttpServlet extends GenericServlet   (位置:javax.servlet.http.HttpServlet)
        具有父类 GenericServlet 类似的方法和对象,是使用 Servlet 编程常用的类
        支持 HTTP 的 post 和 get 等方法。
  3)容器如何找到指定的Servlet?(图示)
    Servlet有 3 个"名字": url 名、 应用中的逻辑名、 实际的名字
    配置文件 web.xml 都把这几个名字一一对应起来了
  Servlet是受容器管理的
    request对象、response对象都是容器根据客户端请求而产生的。
    容器根据url请求,通过DD(web.xml)配置(url名,内部逻辑名,完全限定名)定位具体的servlet。
    容器根据客户请求创建/分配一个线程,并调用servlet的service()方法,把request对象、respone对象作为参数传过去
    service()方法会根据客户端请求的Http方法调用不同的HttpServlet的方法(doGet(),doPost(),...);
    Servlet使用response对象把处理完的结果响应到客户端。
    service()方法结束后,线程要么撤销,要么返回容器的线程池;request对象、response对象都被gc回收。

4.使用Servlet来发送用户输入的信息
  1)开发用户登录的应用
  2)如何使用Form表单来提交数据
     <form action="login" method="POST" enctype="multipart/form-data">
     (1)action: 表单提交给服务器的哪个资源处理
       "login" 为在 web.xml 中配置的 url-pattern 或者是 jsp、html 文件等。
     (2)Get vs. Post方法的比较(使用Http Monitor)
       GET---->通过 URL 提交表单信息,由于受到 URL 长度的限制,只能传递大约 1024(1K)字节。
          通过 http monitor 工具截获请求信息(下面仅写出请求行,请求首部略):
          GET /welcome/login.html?username=zhangsan&password=lisi HTTP/1.1
          //GET是请求方式; /welcome/login.html是请求路径; ?号后面是参数列表,以&分隔; 最后是协议版本
       POST--->通过 Http Body 提交表单信息,传输的数据量大,可以达到 2M。
          由请求行、请求首部、消息体 三部分组成。数据包的形式发送。
          参数放在消息体中,长度不再受限,更安全;而 GET 必须把参数放在请求行。
          通过 http monitor 工具截获请求信息(大略):
          POST /welcome/login.html HTTP/1.1     //请求行
          Accept: ...
          Accept-Language: zh-cn,en-us;q=0.5
          .....
          Host: 127.0.0.1
          .....                                 //从请求行以下到这行,都是请求首部
          username=zhangsan&password=zhangsan   //消息体(有效负载)
       enctype: multipart/form-data :在form中设置此属性后,传输的就是二进制数据,常可用于上传文件

5.如何在服务器端获得表单提供的数据
  1)HttpServletRequest 对象
    由 Web Container 封装了用户的 Http 请求数据包而生成,可通过它获得所有跟用户请求数据报相关的信息。
    getProtocol():String                     ——返回对应的协议       (如:HTTP/1.1)
    getMethod():String                       ——返回 http 对应的方法 (Get|Post)
    getRemoteHost():String                   ——返回远程主机名       (如:127.0.0.1)
    getRemotePort():int                      ——返回远程端口号       (如:55013)
    getHeader(String config):String          ——返回http对应的首部信息(参数如Accept-Language)
    getParameter(String name):String         ——返回指定参数(name)的值(value)   (如:zhangsan)
    getParameterValues(String name):String[] ——返回指定输入参数(名为 name)的所有值(输入的参数列表)
    getParameterNames():Enumeration          ——返回请求对象中全部输入参数的名称
                                               
  2)解决 Servlet 的中文乱码问题
    (1)响应输出静态页面时,处理中文信息乱码: response.setContentType("text/html; charset=utf-8");
    (2)获取数据过程中,处理中文输入乱码(3 种方法):
       方法一:设置字符编码来解决 post 方法提交表单中文乱码问题。
             request.setCharacterEncoding("gbk");
             response.setContentType("text/html;charset=utf-8");
             必须在第一个 request.getParameter("name"); 之前执行上面的语句。
       方法二:重新生成指定编码的字符串
             String name = new String(request.getParamete("name").getBytes("iso-8859-1"));
       方法三:修改服务器的编码设置——解决 get 方法提交表单中文乱码问题
             例如:Tomcat,通过修改%TOMCAT%/conf/server.xml
             加入 URIEncoding="utf-8"
    (3)静态 html 页面的中文化问题
       <head>
            <meta http-equiv="content-type" content="text/html; charset=gbk">
       </head>

6.请求路径
  请求路径是把请求导向到一个 servlet 来响应服务。它是由几个重要的部分来组成的。
  通过 HttpRequest 对象,暴露了如下信息(对照应用的目录结构):
  1)上下文路径(Context Path)
    该路径的前缀是和 ServletContext 相关的。
    如果 Context 就是 Web 服务器的 URL 命名空间的缺省的根上下文时,那么上下文路径将会是一个空的字符串。
    如果上下文并不是服务器的命名空间的根,则上下文路径就以“/”开始,但不能以“/”结束。
  2)Servlet 路径(Servlet Path)
    该路径就是直接与激活该请求的相应映射,它也是以“/”开头。
    但要注意的是,如果指定的请求是与“/*”模式相匹配,则此时 Servlet 路径就是一个空字符串。
  3)路径信息(PathInfo)
    请求路径中除了上下文路径和 Servlet 路径以外的部分。
    当没有额外的路径时路径信息就是空的(null),或者它会以“/”开始的字符串。
  在 HttpServletRequest 接口中定义如下的方法来访问请求路径的相应信息:
    getContextPath();
    getServletPath();
    getPathInfo();
    值得注意的是,请求 URI 和路径的各部分之间的 URL 编码的不同之外,下面的等式恒成立:
    requestURI = contextPath + servletPath + pathInfo

 

URL METHODS BREAKDOWN (JavaEE 6):
http://[host]:[port][request-path]?[query-string]
- requestURL  = http://localhost:8080/myapp/users/profile.xhtml
- requestURI  = /myapp/users/profile.xhtml = contextPath + servletPath + pathInfo
- contextPath = /myapp = the first segment after hostname (unless the app runs and the root app with context /)
- servletPath = /users/profile.xhtml (part after contextPath to the servlet that handled the request)
- pathInfo    = null (what remains after servletPath up to the queryString; would return '/dummy' if the url was '.../profile.xhtml/dummy?id=007')
- queryString = id=007

 

1.容器试图在web.xml中寻找匹配的请求URI。如果找到了,完整的请求URI(除去context路径)即servlet路径。
这时HttpServletRequest.getPathInfo()为null
2.使用/作为分隔符,将请求URI转化为目录树,并通过递归匹配web.xml中URL-PATTERN,获得最长的匹配路径.匹配部分即servlet path
其余为path info
3.如果请求URI的最后一个节点包含一个扩展名(如:.jsp),servlet容器会将它和处理这个种特定的扩展名servlet匹配.
这时, 完整的请求URI, 减去context path即servlet path, 并path info为null.
4.如果容器仍然不能匹配请求路径, 它会将请求forward到默认的servlet.如果没有默认的servlet, 它会发送一条说明服务器没有找到
指定文件未找到的错误信息(404)

Table 1: Example Context Set Up
--------------------------------------------------------------------------------
Context Path                    /catalog
--------------------------------------------------------------------------------
Servlet Mapping 
Pattern: /lawn/* Servlet: LawnServlet

Servlet Mapping 
Pattern: /garden/* Servlet: GardenServlet

Servlet Mapping 
Pattern: *.jsp Servlet: JSPServlet

Table 2: Observed Path Element Behavior
--------------------------------------------------------------------------------
Request Path                               Path Elements
--------------------------------------------------------------------------------
/catalog/lawn/index.html                ContextPath: /catalog
                                                 ServletPath: /lawn
                                                 PathInfo: /index.html
/catalog/garden/implements/           ContextPath: /catalog
                                                 ServletPath: /garden
                                                 PathInfo: /implements/
/catalog/help/feedback.jsp             ContextPath: /catalog
                                                 ServletPath: /help/feedback.jsp
                                                 PathInfo: null

------------------------------------

注意: 下述所说的 URL 都未包含 ContextPath

Servlet 映射的 URL 规范

1. 以 / 开始并以 /* 结束的表示路径映射, 即 /Test/* 表示请求路径以 /Test/ 开始的 URL 映射到该 Servlet 处理
2. 以 *. 开始的表示扩展名映射, 即 *.abc 表示所有以扩展名为 abc 的请求映射到该 Servlet 处理
3. 以 / 开始的表示完全映射, 即 /Test 表示请求 URL 为 /Test 映射到该 Servlet 处理
4. URL Pattern 为 / 表示映射成默认的 Servlet, 当其他 URL 映射未匹配时, 使用默认的 Servlet


路径匹配顺序

1. 先匹配完全映射的 URL
2. 再次匹配路径映射的 URL, 并且最长的路径的匹配优先
3. 再次匹配扩展名映射
4. 最后使用默认的 Servlet

以下为示例

Servlet 映射

path pattern servlet

/foo/bar/* servlet1
/baz/*  servlet2
/catalog servlet3
*.bop  servlet4

incoming path  servlet handling request

/foo/bar/index.html servlet1
/foo/bar/index.bop servlet1
/baz   servlet2
/baz/index.html  servlet2
/catalog  servlet3
/catalog/index.html “default” servlet
/catalog/racecar.bop servlet4
/index.bop  servlet4

各种匹配模式下的 ServletPath 和 PathInfo

1. 完全匹配 ServletPath = 匹配模式 PathInfo = null
2. 扩展名匹配 ServletPath = 请求的URL PathInfo = null
3. 路径匹配 ServletPath = 匹配模式剪去 "/*" PathInfo = 请求URL 剪去 ServletPath
4. 默认 Servlet 匹配 ServletPath = 请求的URL PathInfo = null

如果同样的 URL 被映射到多个 Servlet 时, Serlvet 规范未做说明, tomcat(一个很好用的JSP运行平台) 使用最后一个映射的 Servlet
如果覆盖了容器内设的 Servlet 映射, 使用新的映射

内容概要:本文档系统性地介绍了2024年最新提出的两种智能优化算法——青蒿素优化算法与霜冰优化算法(RIME)的原理、实现方法及其性能对比分析,并提供了完整的Matlab代码实现。文档不仅聚焦于核心算法的仿真与验证,还整合了大量前沿科研资源,涵盖微电网优化、风电功率预测、无人机三维路径规划、电动汽车调度、图像融合、负荷预测、通信信号处理、电力系统故障恢复等多个高价值应用场景。所有案例均基于Matlab/Simulink平台进行建模与仿真,强调算法在复杂工程系统中的实际应用能力,旨在为科研人员提供一套从理论到代码再到应用的完整复现体系。; 适合人群:具备一定编程基础和科研背景的研究生、高校教师及工程技术人员,尤其适合从事智能优化算法研究、新能源系统优化、自动化控制、电力系统调度、无人机导航与路径规划等相关领域的研究人员。; 使用场景及目标:①用于高水平学术论文的复现与创新性研究,提升科研效率与成果产出;②应用于复杂工程系统的建模仿真与智能优化设计,如多能互补系统调度、无人机避障路径规划、微电网能量管理等;③作为智能优化算法的教学与学习资料,深入理解现代元启发式算法的设计思想与实现机制。; 阅读建议:建议读者结合文档中提供的Matlab代码与Simulink仿真模型,按照目录结构循序渐进地学习与实践,优先选择与自身研究方向契合的案例进行代码复现,重点关注算法参数设置、收敛曲线分析与多算法对比实验部分,以全面提升算法应用与科研创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值