JAVA EE WEB学习(二)

创建第一个Servlet

Servlet作用

  1. 直接处理和响应用户请求
  2. 将处理工作委托给应用中其他部分的类
  3. WEB容器会有一个或多个Servlet,用于处理JSP、显示目录列表、访问静态资源

继承的servlet类

  1. 继承HttpServlet
  2. 接收HttpServletRequest和HttpServletResponse参数

简单例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo3 extends HttpServlet {
private static final String DEFAULT_USER="Guest";
/**
* Constructor of the object.
*/
public Demo3() {
super();
}

/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println(this.getServletInfo());
System.out.println("fin");

}

/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String user =request.getParameter("user");
if(user==null)
{
user=Demo3.DEFAULT_USER;
}
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");

PrintWriter out = response.getWriter();
out.append("<!DOCTYPE HTML>\r\n")
.append("<HTML>\r\n")
.append(" <HEAD>\r\n")
.append(" <TITLE>A Servlet</TITLE>\r\n")
.append(" </HEAD>\r\n")
.append(" <BODY>\r\n")
.append(" Hello, ").append(user).append("!<br/><br/>\r\n")
.append(" <form action=\"demo3\" 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");


}

/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}

/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
System.out.println("start");
System.out.println(this.getServletName());
}

}

注意点

  1. init方法在构造完成之后,响应第一个请求之前调用
  2. 调用init方法时,Servlet中所有属性都已设置完,提供了对ServletConfig和SercletContext对象的访问。
  3. 可以使用init方法读取属性文件或使用JDBC连接数据库
  4. destory方法在Servlet不再接受请求之后立即调用,即web应用程序被停止或卸载,或Web容器关闭时。因此:应该使用destory方法清理servlet持有的资源

配置可部署的Servlet

  1. 在web.xml中部署,一般IDE会在创建时自动部署。
1
2
3
4
5
<servlet>
.....
.....
<load-on-startup>x</load-on-startup>
</servlet>

Servlet按照x大小顺序启动,越小优先级越高。

  1. 将Servlet映射到URL
    <servlet-name>对应<url-pattern>一个servlet可以映射到多个url

了解doGet、doPost和其他方法

HttpServletRequest

  1. 功能:从客户端发送的请求中获取参数。参数有两种形式:查询参数和请求正文(post请求)。查询参数在HTTP请求的第一行数据中如GET /index.jsp?id=412&category=Books HTTP/1.1中有两个查询参数:id和category 或 作为post变量保存在请求正文中
  2. 获取请求参数:方法getParameter返回参数单个值,或多个参数第一个值;getParameterValues返回参数值的数组;getParameterMap返回包含所有参数名值对;getparameterNames返回所有可用参数的名字的枚举。后两种方法一般用于遍历所有请求参数。
  3. 确定与请求内容相关的信息:getContentType返回请求的内容类型;getContentLength返回请求正文长度。
  4. 读取请求的内容:getInputStream读二进制格式;BufferedReader读基于字符编码。不要在同一请求上同时使用这两种方法;不要在含post变量的请求上使用这些方法
  5. 获取请求特有的数据getRequestURL:返回完整URL;getRequestURI:返回服务器路径;getServletPath:只返回Servlet映射的URL;

HttpServletResponse

  1. 功能:提供了对响应中与HTTP协议相关属性的访问。可用于:设置响应头、编写相应正文、重定向请求、设置HTTP状态码等
  2. 编写响应正文:将内容输出到响应正文中。getOutputStream和getWritter都可以向响应中输出数据。不要对同一响应对象同时使用这两种方法。
  3. 设置内容类型或编码格式:使用setContentType和setCharacterEncoding方法。必须放在getWritter方法之前,否则返回到writer使用容器默认编码。
  4. 设置头和其他响应属性:暂略

使用初始化参数配置应用程序

使用上下文初始化参数

  1. 在web.xml文件中用<context-param>标签声明上下文初始化参数 <servlet>外部
  2. 在Servlet代码中获得和使用这些参数:先获得servletcontext(getServletContext),用这个实例的getInitParameter方法,参数为param-name可得到param-value。

使用servlet初始化参数

  1. <init-param>添加到<servlet>内部
  2. 在Servlet代码中获得和使用这些参数:先获得ServletConfig(getServletConfig),用这个实例的getInitParameter方法,参数为param-name可得到param-value。
  3. 通常用这种方式改变数据库服务器的IP地址

通过表单上传文件