Servlet&JSP 第二章 编写与设置Servlet

一、第一个Servlet

1、Servlet接口定义了Servlet应当有的基本行为,例如,与Servlet生命周期相关的init()、destroy()方法,提供服务时所要调用的service()方法等。

2、Servlet实例1

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

@WebServlet("/Hello.view")//请求的URL为/Hello.view
public class HelloServlet extends HttpServlet{
	//重新定义doGet()方法,从HttpServletRequest对象中取得有关HTTP请求相关信息,HttpServletResponse对象代表对客户端的响应
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
	response.setContentType("text/html;charset=UTF-8");  //通过HttpServletResponse的setContentType()方法设置正确的内容类型
	PrintWriter out=response.getWriter();  //通过HttpServletResponse的getWriter()方法取得代表响应输出的PrintWriter对象
	String name=request.getParameter("name");  //通过HttpServletRequest的getParameter()方法并指定请求参数名称,来取得用户发送的请求参数值
	out.println("<html>");  //通过PrintWriter的println()方法来对浏览器输出响应的文字信息
	out.println("<head>");
	out.println("<title>Hello Servlet</title>");
	out.println("</head>");
	out.println("<body>");
	out.println("<h1>Hello!"+name+"!</h1>");
	out.println("</body>");
	out.println("</html>");
	out.close();
  }
}

运行结果


二、关于HttpServlet

1、实现Servlet接口的类是GenericServlet类,它还实现了ServletConfig接口,将容器调用init()方法时所传入的ServletConfig实例封装起来,而service()方法直接标示为abstract而没有任何实现。

2、GenericServlet类并没有规范任何有关HTTP的相关方法,而是由继承它的HttpServlet来定义,HTTP相关服务流程定义在HttpServlet的service()方法中。

3、与Servlet定义相关的类或接口都位于javax.servlet包中,与HTTP定义相关的类或接口都位于javax.http.servlet包中。

4、HttpServlet中service()方法的大致流程:

当请求来到时,容器会调用Servlet的service()方法,HttpServlet的service()中定义的,基本上是判断HTTP的请求方式,在分别调用doGet()、doPost()等方法,所以若想针对GET、POST等方法进行处理,只需在继承HttpServlet之后,重新定义doGet()、doPost()方法。

三、使用@WebServlet

1、只要在Servlet上设置@WebServlet标注,容器就会自动读取当中的信息。

例1:

@WebServlet(
name="Hello",  //Servlet的名称是Hello,由name属性指定
urlPatterns={"/Hello.view"},  //若客户端请求的URL是/Hello.view,则由具Hello名称的Servlet来处理,由urlPatterns属性指定
loadOnStartup=1
)
public class HelloServlet extends HttpServlet{
没有设置的属性通常会有默认值,例如,若没有设置name属性,默认值会是Servlet的类完整名称。

2、当应用程序启动后,事实上并没有创建所有的Servlet实例,容器会在首次请求需要某个Servlet服务时,才将对应的Servlet类实例化,进行初始化操作,然后再处理请求,这意味着第一次请求该Servlet的客户端,必须等待Servlet类实例化、进行初始化操作所必须花费的时间,才真正得到请求的处理。

3、如果希望应用程序启动时,就先将Servlet类载入、实例化并做好初始化操作,则可以使用loadOnStartup设置,设置大于0的值(默认值为-1),表示启动程序后就要初始化Servlet(而不是实例化几个Servlet),数字代表了Servlet的初始化顺序,容器必须保证有较小数字的Servlet先初始化,在使用标注的情况下,如果有多个Servlet在设置loadOnStartup时使用了相同的数字,则容器实现厂商可以自行决定如何载入哪个Servlet。

四、使用web.xml

web.xml中的设置会覆盖使用Servlet中的标注信息,可使用标注来做默认值,而web.xml来做日后更改设置值。

1、一个Servlet在web.xml中会有三个名称设置:

(1)<url-pattern>:设置的逻辑名称

(2)<servlet-name>:注册的Servlet名称

(3)<servlet-class>:设置的实体类名称

五、文件组织与部署

1、WEB-INF:这个目录名称是固定的,而且一定是位于应用程序根目录下,放置在WEB-INF中的文件或目录,对外界来说是封闭的,也就是客户端无法使用HTTP的任何方式直接访问到WEB-INF中的文件或目录。若有这类需要,则必须通过Servlet/JSP的请求转发。不想让外界存取的资源,可以放置在这个目录下。

2、web.xml:这是Web应用程序部署描述文件,一定是放在WEB-INF根目录下,名称一定是web.xml。

3、lib:放置JAR文件的目录,一定是放置在WEB-INF根目录下,名称一定是lib。

4、classes:放置编译过后.class文件的目录,一定是放在WEB-INF目录下,名称一定是classes,编译过后的类文件,必须有与包名称相符的目录结构。(必须包括包结构)

5、实际上在部署Web应用程序时,会将Web应用程序封装为一个WAR文件,也就是一个后缀为*.war的文件,WAR文件可使用JDK所附的jar工具程序来建立,WAR文件是使用zip压缩格式封装的,可以使用解压缩软件来查看其中的内容。

六、进阶部署设置

1、URL模式设置

(1)一个请求URI实际是由三个部分组成:requestURI=contextPath+servletPath+pathInfo

(2)环境路径(contextPath)是容器用来决定该挑选哪个Web应用程序的依据(一个容器上可能部署多个Web应用程序),环境路径的设置方式标准中并没有规范,可使用HttpServletRequest的getContextPath()方法来取得环境路径。如果应用程序路径与Web服务器环境跟路径相同,则应用程序环境路径为空字符串,如果不是,应用程序环境路径以“/”开头,不包括“/”结尾。一旦决定是哪个Web应用程序处理请求,Servlet必须设置URL模式,可以设置的格式分别说明如下:

路径映射:以“/”开头但以“/*”结尾的URL模式。

例:设置URL模式为“/guest/*”,则请求扣去环境路径部分若为以“/guest/”作为开头的,都会交由该Servlet处理。

扩展映射:以“*.”开头的UR;模式。

例:若URL模式设置为“*.view”,则所有以“.view”结尾的请求,都会交由该Servlet处理。

环境根目录映射:空字符串“”是个特殊的URL模式,对应至环境根目录,也就是“/”请求,但不用于设置<url-pattern>或urlPattern属性。

例:若环境根目录为APP,则http://host:post/App/的请求,路径信息是“/”,而Servlet路径与环境路径都是空字符串。

预设Servlet:仅包括“/”的URL模式,当找不到适合的URL模式对应时,就会使用预设Servlet。

完全匹配:不符合以上设置的其他字符串,都要做路径的严格对应。

例:若设置/guest/test.view,则请求不包括请求参数部分,必须是/guest/test.view。

(3)Servlet路径(servletPath):不包括路径信息与请求参数,Servlet路径直接对应到URL模式信息,可使用HttpServletRequest的getServletPath()方法来取得。Servlet路径基本上是以“/”开头,但“/*”与“”的URL模式比对而来的请求除外,在“/*”与“”情况下,getServletPath()方法取得的Servlet路径是空字符串。

(4)路径信息(pathInfo):路径信息不包括请求信息,指的是不包括环境路径与Servlet路径部分的额外路径信息,可使用HttpServletRequest的getPathInfo()方法来取得。如果没有额外路径信息,则为null(扩展映射、预设Servlet、完全匹配的情况下,getPathInfo()方法就会取得null),如果有额外路径信息,则是一个以“/”开头的字符串。

2、Servlet实例2

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

@WebServlet("/servlet/*")
public class PathServlet extends HttpServlet{
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
	PrintWriter out=response.getWriter();
	out.println("<html>");
	out.println("<head>");
	out.println("<title>ServletPattern</title>");
	out.println("</head>");
	out.println("<body>");
	out.println(request.getRequestURI()+"<br>");
	out.println(request.getContextPath()+"<br>");
	out.println(request.getServletPath()+"<br");
	out.println(request.getPathInfo());
	out.println("</body>");
	out.println("</html>");
	out.close();
  }
}
运行结果

七、Web目录结构

一个Web应用程序基本上会由以下项目组成:静态资源(HTML、图片、声音等)、Servlet、JSP、自定义类、工具类、部署描述文件(web.xml等)、设置信息(
Annotation等)。

1、Web应用程序目录结构必须符合规范,例如一个应用程序的环境路径是/openhome,则所有的资源项目必须从/openhome目录依规定结构摆放,基本是根目录中的资源可以直接下载。

2、Web应用程序存在一个特殊的/WEB-INF目录,此目录中存在的资源项目不会被列入应用程序根目录中可直接访问的项。

3、可以在JAR文件的/META-INF/resource目录中放置静态资源或JSP等。

4、如果要用到某个类,则Web应用程序会到/WEB-INF/lib的JAR文件中需找类资源,若还没有找到,则会到容器实现本身存放类或JAR的目录中寻找。

5、客户端不可以直接请求/WEB-INF中的资源,但可以通过程序的控制,让程序来取得/WEB-INF中的资源,如使用ServletContext的getResource()与getResourceAsStream()方法,或是通过RequestDispatcher请求调派。

6、如果Web应用程序的URL最后是以“/”结尾,而且确实存在该目录,则Web容器必须返回该目录下的欢迎页面,可以在部署描述文件web.xml中定义指出可用的欢迎页面名称为何,如果有则返回给客户端,如果找不到文件,则会尝试至JAR的/META-INF/resource中寻找已放置的资源页面;如果URL最后是以“/”结尾,但部存在该目录,则会使用预设Servlet。

7、整个Web应用程序可以被封装为一个WAR文件,以便部署至Web容器。

八、使用web-fragment.xml

1、web-fragment.xml

(1)一个JAR文件中,除了可以使用标注定义的Servlet、监听器、过滤器外,也可以拥有自己部署描述文件,这个文件的名称是web-fragment.xml。必须放置在JAR文件的META-INF目录中,基本上,web.xml中可定义的元素,在web-fragment.xml也可以定义。

2、web.xml与web-fragment.xml的配置顺序

(1)可在web.xml中使用<absolute-ordering>定义绝对顺序;

(2)也可直接在每个JAR文件的web-fragment.xml中使用<ordering>,在其中使用<before>或<after>来定义顺序。

3、各个JAR文件中web-fragment.xml定义的名称不得重复,若有重复,则会忽略掉重复的名称。

4、metadata-complete属性

(1)如果将web.xml中的<web-app>的metadata-complete属性设置为true(默认为false),则表示web.xml中已完成Web应用程序的相关定义,部署时不会扫描标注与web-fragment.xml中的定义,如果有<ordering>与<absolute-ordering>也会被忽略。

(2)如果web-fragment.xml中指定的类可以在Web应用程序的/WEB-INF/classes中找到,就会使用该类,如果该类本身有标注,而web-fragment.xml又定义为Servlet,则此时会有两个Servlet实例,如果将<web-fragment>的metadata-complete属性设置为true,就只会处理自己JAR文件中的标注信息。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值