Java Web高级编程(一)
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高级编程(一)的更多相关文章
- Java Web高级编程(四)
WebSocket 一.WebSocket的产生 用户希望Web页面可以进行交互,用于解决这个问题的技术是JavaScript,现在Web上有许多的可用的JavaScript框架,在使用极少的Java ...
- Java Web高级编程(三)
使用过滤器改进应用程序 一.过滤器的目的 过滤器是可以拦截访问资源的请求.资源的响应或者同时拦截两者的应用组件.过滤器可以检测和修改请求和响应,同时也可以拒绝.重定向或转发请求.javax.servl ...
- Java Web高级编程(二)
使用会话维持状态 一.会话 为了实现关联同一个用户端的多个请求和这些请求之间数据的共享,需要用到会话,会话用于维持请求和请求之间的状态.从服务器的角度,当用户的Web浏览器打开第一个链接到服务器的套接 ...
- java web高级编程 笔记1
chapter1:了解web应用程序 web应用程序主要组件: Servlet 过滤器 监听器 JSP chapter2:各类web容器介绍 略 chapter3:Servlet介绍 Servlet是 ...
- Java web切面编程
在我们的 web开发中 我们在 对公用的 一些方法 我们需要抽取出来 这样达到 代码的冗余 今天 我利用项目上用的AOP的 实际 应用做了一个整理 首先 xml配置 扫描 <?xm ...
- JavaEE-实验三 Java数据库高级编程
该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.在MySQL中运行以下脚本 CREATE DATABASE mydatabase; USE mydatabase; CREA ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:继承的应用
class Array{ // 表示数组 private int temp[] ; // 整型数组 private int foot ; // 定义添加位置 public Array(int len) ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:匿名内部类
interface A{ public void printInfo() ; // } class B implements A{ // 实现接口 public void printInfo(){ S ...
- 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:包装类
public class WrapperDemo01{ public static void main(String args[]){ int x = 30 ; // 基本数据类型 Integer i ...
随机推荐
- cap deploy:setup报错
今天部署cap的时候,setup出现以下错误: 查询半天未果,不过最后还是在google找到了,可见度娘极为不靠谱! I had the same error on deploy:setup with ...
- vue.js初学,笔记1,安装
最近学习vue.js,下面是笔记: 说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事.来自官网:"这 ...
- jQuer __Ajax DOM
链接:在线jQueryhttp://www.bootcdn.cn 一.each(遍历) $("ul li").each(function(index,value){ ale ...
- TCP程序中发送和接收数据
这里我们来探讨一下在网络编程过程中,有关read/write 或者send/recv的使用细节.这里有关常用的阻塞/非阻塞的解释在网上有很多很好的例子,这里就不说了,还有errno ==EAGAIN ...
- 解决EditText跟ScrollView滑动冲突
etContent.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, Motion ...
- gcc 源代码分析-前端篇3
3. GCC怎样函表示一个函数 对c语言来说.函数是其核心,全部的东西都在环绕着函数在转.对于一个函数来说.它基本的一些特性例如以下: 1. 有一个返回值,在这里我们没有把返回值的函数觉得它 ...
- Lucene41PostingWriter源代码分析
原来看lucene4.0的posting格式(http://blog.csdn.net/jollyjumper/article/details/30017581),发现这还是比較简单的VInt格式,据 ...
- php&&页面静态化
页面静态化.主要是出于两个方面的考虑. 第一:訪问html页面的速度比訪问php页面的速度快.在訪问php页面时候.须要对php进行解析.訪问html时候,直接浏览器能够解析出来.特别是PV量 ...
- Oracle自动备份数据
一. Oracle自动备份单表一个月数据 方式一:三步处理(建批处理文件,写sql文件,设置任务计划) 1. 第一步:建立一个批处理文件 @echo off Set OrclSid=orcl Set ...
- MPSOC之8——启动及错误处理
有了BOOT.BIN(fsbl+pmu+atl+uboot).uImage.uramdisk.image.gz,dtb文件,就可以启动了.把上述文件统统拷贝到SD卡,并设置开发板为SD卡启动. 0. ...