Servlet

一、创建Servlet类

在Java EE中,Servlet用来接收和响应终端用户的请求。Servlet是所有Web应用程序的核心类,是唯一既可以直接处理和响应用户请求,也可以将处理工作委托给应用中的其它部分的类。除非某些过滤器提前终止了客户端的请求,否则所有的请求都将被发送到某些Servlet中。

所有的Servlet都实现了javax.servlet.Servlet接口,但通常不是直接实现的,Servlet知识一个简单的接口,包含了初始化并销毁和处理请求的方法。无论什么类型的请求都将会调用service方法。

作为响应HTTP请求的java.servlet.http.HttpServlet,并实现了只接受HTTP请求的service方法。提供了响应每种HTTP方法类型的方法的空实现。

方法 Servlet方法 目的
GET doGet() 从指定的URL中获取资源
HEAD doHead() 与GET一致,但是只返回头部数据
POST doPost() 通常用于处理Web表单提交
PUT doPut() 存储URL中提供的实体
DELETE doDelete() 删除URL标识的资源
OPTIOND doOptions() 返回支持的HTTP方法
TRACE doTrace() 用于诊断目的

Servlet将总是继承HttpServlet。这样方法的接受的是javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse参数,这样就可以轻松访问Servlet服务所处理的请求中的HTTP特定的特性。

创建全新的空Servlet开始,让它继承HttpServlet。任何未重写的HTTP Servlet方法都将返回一个HTTP状态405作为响应,需要重写doGET()方法,添加对HTTP GET方法的支持。

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class helloServlet extends HttpServlet{   
@Override   
protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{   resopnse.getWriter().println(" ");   }
}

初始化方法和销毁方法

@Override
public void init() throws ServletException
{
System.out.println("Servlet " + this.getServletName() + " has started.");
} @Override
public void destroy()
{
System.out.println("Servlet " + this.getServletName() + " has stopped.");
}

二、配置可部署的Servlet

在创建完Servlet之后,尽管已经有了一个可以响应HTTP GET请求并发出问候的类,需要再WEB-INF目录中创建的web.xml文件,并对Servlet进行配置,使它可以正确地部署到服务器中。然后使得浏览器可以访问到该Servlet。

在web.xml中的初始化文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <display-name>Hello World Application</display-name><--?代表了应用程序在应用服务器中显示的名字--> </web-app>

当需要该诉Web容器创建一个之前实例Servlet的实例,因此在描述符文件中的开始和结束标志符中添加一个Servlet标签:

<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.wrox.HelloServlet</servlet-class>
</servlet>

同时

<load-on-startup>1</load-on-startup>

如果多个Servlet配置都包含了该标签,它们将按照标签内值的大小顺序启动,值越小越先启动。,如果多个Servlet的<load-on-startup>配置相同,将按照它们在描述符文件中出现的顺序启动。

将Servlet映射到URL中,在告诉应用服务器如何启动Servlet之后,需要告诉该Servlet应该如何应该对那些请求URL做出响应:

<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/greeting</url-pattern>
</servlet-mapping>

使用该配置之后,所有访问应用程序相对URL/greeting的请求都将有helloServlet处理,其中<servlet>和<servlet-mapping>标签内的<servlet-name>标签应该一致。当然可以通过多个<url-pattern>标签,让多个URL映射到同一个servlet中。对有相同逻辑但是不同处理页面的web就可以将其连接到同一个servlet,只是在<servlet-name>中添加不同的实例名称。

三、doGet()和doPost()

Servlet类的service方法会处理所有到达的请求。最终,它必须根据所使用的协议解析并处理到达请求中的数据,然后返回客户端可接受的响应。扩展HttpServlet使我们不需要考虑到任何细节。

HttpServletRequest接口是对ServletRequest的扩展,将提供关于收到请求的额外的与HTTP协议相关信息。

获取请求参数:

HttpServletRequest最重要的功能是从客户端发送的请求中获取参数。请求参数有两种不同的形式:

查询参数(URI参数),以application/x-www-form-urlencodeed或multipart/form-data编码的请求正文。

getParameter方法将返回参数的单个值,如果参数有多个值,将返回第一个值,getParameterValues将返回参数的值的数组。

确定与请求内容相关的信息:

getContentType方法将确定HTTP请求内容的类型,

getContentLenght方法和getContentLengthLong都返回了请求正文的长度,

getCharacterEncoding方法将返回请求内容的字符编码。

读取请求的内容:

getInputStream和getReader都可以用来读取请求的内容,如果是UTF-8和ISO-8859-1则使用getReader是最简单的方法,如果是二进制格式则使用getInputStream是最方便的,但是在调用其中一个方法之后不可以再调用另外一个。

获取请求的特有数据:

getRequestURL,返回客户端完整用于创建请求的完整的URL。

getRequestURI,只返回URL中服务器路径部分。

getServletPath,返回更少的URI。

getHeader,返回制定名字的头数据。

getHeaderName,返回请求中所有头数据的名字的枚举。

getIntHeader和getDataHeader。

使用HttpServletResponse

HttpServletResponse提供了对请求中与HTTP协议相关属性的访问,并且可以使用相应对象完成设置响应头,编写响应正文,重定向请求,设置HTTP状态码以及将Cookies返回到客户端等任务。

编写响应正文:

就是讲内容输出道响应正文中,可以是在浏览器中显示的HTML、浏览器中希望获取的图像或者下载的文件内容。getOutputStream方法将返回一个javax.servlet.ServletOutputStream,而方法getWriter将返回一个java.io.PrintWriter,通过他们可以向响应中输出数据,但是不要对一个对象同时使用上述两种方法。在向响应正文中输出数据时,可能需要设置内容类型或编码格式:setContentType和setCharacterEncoding。

另外还可以使用:

setStatus:设置HTTP响应状态码,

getStatus:获取当前的响应状态,

sendError:设置状态码,

sendRedirect:将客户端重定向至另一个URL。

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String user = request.getParameter("user");
if(user == null)
user = HelloServlet.DEFAULT_USER; response.setContentType("text/html");
response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter();
writer.append("<!DOCTYPE html>\r\n")
.append("<html>\r\n")
.append(" <head>\r\n")
.append(" <title>Hello User Application</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n")
.append(" Hello, ").append(user).append("!<br/><br/>\r\n")
.append(" <form action=\"greeting\" method=\"POST\">\r\n")
.append(" Enter your name:<br/>\r\n")
.append(" <input type=\"text\" name=\"user\"/><br/>\r\n")
.append(" <input type=\"submit\" value=\"Submit\"/>\r\n")
.append(" </form>\r\n")
.append(" </body>\r\n")
.append("</html>\r\n");
}

四、初始化参数配置应用程序

初始化参数配置应用程序可以提供一些配置应用程序和其中Servlet的方式。通过上下文初始化参数和Servlet初始化参数进行设置是最简单的方法,这些参数可以定义关系数据库的链接信息,提供发送订单警告的邮件地址,这些参数在启动时定义,重启才会被修改。

    <context-param>
<param-name>settingOne</param-name>
<param-value>foo</param-value>
</context-param>
<context-param>
<param-name>settingTwo</param-name>
<param-value>bar</param-value>
</context-param>

在初始化参数之后可以在Servlet代码的任何地方使用这些参数

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
ServletConfig c = this.getServletConfig();
PrintWriter writer = response.getWriter(); writer.append("database: ").append(c.getInitParameter("database"))
.append(", server: ").append(c.getInitParameter("server"));
}

另外一种初始化参数的方法是通过注解:

@WebServlet{
name = "servletParameterServlet",
urlPatterns = {"/servletParameters"},
initParams = {
@WebInitParam{name = "database", value = "CustomerSupport"},
@WebInitParam{name = "server", value = "10.0.12.5"}
}
}

Java Web高级编程(一)的更多相关文章

  1. Java Web高级编程(四)

    WebSocket 一.WebSocket的产生 用户希望Web页面可以进行交互,用于解决这个问题的技术是JavaScript,现在Web上有许多的可用的JavaScript框架,在使用极少的Java ...

  2. Java Web高级编程(三)

    使用过滤器改进应用程序 一.过滤器的目的 过滤器是可以拦截访问资源的请求.资源的响应或者同时拦截两者的应用组件.过滤器可以检测和修改请求和响应,同时也可以拒绝.重定向或转发请求.javax.servl ...

  3. Java Web高级编程(二)

    使用会话维持状态 一.会话 为了实现关联同一个用户端的多个请求和这些请求之间数据的共享,需要用到会话,会话用于维持请求和请求之间的状态.从服务器的角度,当用户的Web浏览器打开第一个链接到服务器的套接 ...

  4. java web高级编程 笔记1

    chapter1:了解web应用程序 web应用程序主要组件: Servlet 过滤器 监听器 JSP chapter2:各类web容器介绍 略 chapter3:Servlet介绍 Servlet是 ...

  5. Java web切面编程

    在我们的 web开发中  我们在 对公用的 一些方法 我们需要抽取出来   这样达到 代码的冗余   今天 我利用项目上用的AOP的 实际 应用做了一个整理 首先  xml配置  扫描 <?xm ...

  6. JavaEE-实验三 Java数据库高级编程

    该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.在MySQL中运行以下脚本 CREATE DATABASE mydatabase; USE mydatabase; CREA ...

  7. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:继承的应用

    class Array{ // 表示数组 private int temp[] ; // 整型数组 private int foot ; // 定义添加位置 public Array(int len) ...

  8. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:匿名内部类

    interface A{ public void printInfo() ; // } class B implements A{ // 实现接口 public void printInfo(){ S ...

  9. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:包装类

    public class WrapperDemo01{ public static void main(String args[]){ int x = 30 ; // 基本数据类型 Integer i ...

随机推荐

  1. cap deploy:setup报错

    今天部署cap的时候,setup出现以下错误: 查询半天未果,不过最后还是在google找到了,可见度娘极为不靠谱! I had the same error on deploy:setup with ...

  2. vue.js初学,笔记1,安装

    最近学习vue.js,下面是笔记: 说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事.来自官网:"这 ...

  3. jQuer __Ajax DOM

    链接:在线jQueryhttp://www.bootcdn.cn   一.each(遍历)   $("ul li").each(function(index,value){ ale ...

  4. TCP程序中发送和接收数据

    这里我们来探讨一下在网络编程过程中,有关read/write 或者send/recv的使用细节.这里有关常用的阻塞/非阻塞的解释在网上有很多很好的例子,这里就不说了,还有errno ==EAGAIN ...

  5. 解决EditText跟ScrollView滑动冲突

    etContent.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, Motion ...

  6. gcc 源代码分析-前端篇3

    3. GCC怎样函表示一个函数   对c语言来说.函数是其核心,全部的东西都在环绕着函数在转.对于一个函数来说.它基本的一些特性例如以下:    1. 有一个返回值,在这里我们没有把返回值的函数觉得它 ...

  7. Lucene41PostingWriter源代码分析

    原来看lucene4.0的posting格式(http://blog.csdn.net/jollyjumper/article/details/30017581),发现这还是比較简单的VInt格式,据 ...

  8. php&amp;&amp;页面静态化

    页面静态化.主要是出于两个方面的考虑.     第一:訪问html页面的速度比訪问php页面的速度快.在訪问php页面时候.须要对php进行解析.訪问html时候,直接浏览器能够解析出来.特别是PV量 ...

  9. Oracle自动备份数据

    一. Oracle自动备份单表一个月数据 方式一:三步处理(建批处理文件,写sql文件,设置任务计划) 1. 第一步:建立一个批处理文件 @echo off Set OrclSid=orcl Set ...

  10. MPSOC之8——启动及错误处理

    有了BOOT.BIN(fsbl+pmu+atl+uboot).uImage.uramdisk.image.gz,dtb文件,就可以启动了.把上述文件统统拷贝到SD卡,并设置开发板为SD卡启动. 0. ...