参考文献:http://www.runoob.com/servlet
tomcat安装
为啥又安装,因为它又又又死了。下载解压就不说了。
- 双击
bin
目录下的java8w.exe
出现unable to open the service tomcat8
解决方法:在bin
目录下运行service.bat install
- 在logs目录下,发现问题为
"Address already in use: JVM_Bind"
解决方法:1
2
3netstat -ano |findstr "8080" #查看被占用的端口
tasklist |findstr "4760" #查看进程名
taskkill /f /im 进程名 #关闭进程
最后双击startup.bat
启动 Tomcat。
Servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自Web 浏览器或其他HTTP 客户端的请求
和HTTP 服务器上的数据库或应用程序之间
的中间层。使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。(莫名感觉和php的作用有点像)
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
eclipse创建Servlet实例
File-->New-->Servlet
①hello world
在自动创建的
HelloServlet.java
的doGet()函数
中添加1
response.getWriter().write("Hello world");
在
web.xml
中添加1
2
3
4
5
6
7
8
9
10
11<servlet>
<!-- 类名 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 所在的包 -->
<servlet-class>cn.sheng.test.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!-- 访问的网址 -->
<url-pattern>/test/HelloServlet</url-pattern>
</servlet-mapping>访问
http://localhost:8080/test/HelloServlet
得到Hello world
👂用get方式
提交数据
在自动创建的
HelloServlet.java
的doGet()函数
中添加1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17response.setContentType("text/html;charset=UTF-8"); // 设置响应内容类型
PrintWriter out = response.getWriter();
String title = "使用 GET 方法读取表单数据";
String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8"); // 处理中文
String docType = "<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>站点名</b>:"
+ name + "\n" +
" <li><b>网址</b>:"
+ request.getParameter("url") + "\n" +
"</ul>\n" +
"</body></html>");在
web.xml
中添加的内容同上- 访问
http://localhost:8080/test/HelloServlet?name=123&url=www.123.com
得到get方式
提交的内容
🌂用表单的POST 方法
提交数据
在
WebContent目录
下创建post.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试界面</title>
</head>
<body>
<form action="HelloServlet" method="POST">
网址名:<input type="text" name="name">
<br />
网址:<input type="text" name="url" />
<br />
<input type="checkbox" name="runoob" checked="checked" /> 菜鸟教程
<input type="checkbox" name="google" /> Google
<input type="checkbox" name="taobao" checked="checked" /> 淘宝
<input type="submit" value="提交" />
</form>
</body>
</html>HelloServlet.java
中的doGet()方法
中添加。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
41response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "接收全部数据";
String name =new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8"); // 处理中文
String docType = "<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"</ul>\n" +
"<table width=\"100%\" border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
"<th>参数名称</th><th>参数值</th>\n"+
"</tr>\n");
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String[] paramValues =
request.getParameterValues(paramName);
if (paramValues.length == 1) { // 读取单个值的数据
String paramValue = paramValues[0];
if (paramValue.length() == 0)
out.println("<td><i>没有值</i></td>");
else
out.println("<td>" + paramValue + "</td>");
} else { // 读取多个值的数据
out.println("<td><ul>");
for(int i=0; i < paramValues.length; i++) {
out.println("<li>" + paramValues[i]);
}
out.println("</ul></td>");
}
out.print("</tr>");
}
out.println("\n</table>\n</body></html>");
}在web.xml中添加的内容同上
- 访问
http://localhost:8080/test/post.html
打开html界面
,向表单中添加数据并提交。
④使用HttpServletRequest
的getHeaderNames()方法
读取 HTTP 头信息
HelloServlet.java
中的doGet()方法
中添加。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String title = "HTTP Header请求";
String docType =
"<!DOCTYPE html> \n";
out.println(docType +
"<html>\n" +
"<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n"+
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<table width=\"100%\" border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
"<th>Header 名称</th><th>Header 值</th>\n"+
"</tr>\n");
Enumeration headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String paramName = (String)headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);
out.println("<td> " + paramValue + "</td></tr>\n");
}
out.println("</table>\n</body></html>");在
web.xml
中添加的内容同上- 打开网址
http://localhost:8080/test/HelloServlet
可以看到HTTP 头信息
🌫HTTP Header 响应实例
PS:data导入的jar包:import java.util.Date;
HelloServlet.java
中的doGet()方法
中添加。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17response.setIntHeader("Refresh", 5); // 设置刷新自动加载时间为 5 秒
response.setContentType("text/html;charset=UTF-8"); // 设置响应内容类型
Calendar cale = Calendar.getInstance(); //使用默认时区和语言环境获得一个日历
Date tasktime=cale.getTime(); //将Calendar类型转换成Date类型
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置日期输出的格式
String nowTime = df.format(tasktime); //格式化输出
PrintWriter out = response.getWriter();
String title = "自动刷新 Header 设置";
String docType =
"<!DOCTYPE html>\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n"+
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<p>当前时间是:" + nowTime + "</p>\n");
}在
web.xml
中添加的内容同上- 打开网址
http://localhost:8080/test/HelloServlet
可以看到时间且5秒刷新一次
⑥HTTP 状态码实例1
response.sendError(404, "页面不存在" );
- 在
web.xml
中添加的内容同上 - 打开网址
http://localhost:8080/test/HelloServlet
可以看到404页面
⑦Servlet 过滤器实例
test(项目)-->New-->Filter
Filter.java
1
2
3
4
5
6
7
8public void init(FilterConfig fConfig) throws ServletException {
String site = fConfig.getInitParameter("Site"); // 获取初始化参数
System.out.println("网站名称: " + site); // 输出初始化参数
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {
System.out.println("站点网址:http://www.runoob.com"); // 输出站点名称
chain.doFilter(request,response); // 把请求传回过滤链
}web.xml
添加以下内容,其他同上1
2
3
4
5
6
7
8
9
10
11
12<filter>
<filter-name>Filter</filter-name>
<filter-class>cn.sheng.test.Filter</filter-class>
<init-param>
<param-name>Site</param-name>
<param-value>百度</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml
中的元素:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
<dispatcher>子元素可以设置的值及其意义
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
- 访问
http://localhost:8080/test/test/HelloServlet
在控制台会出现一次网站名称:百度
和两次站点网址:http://www.baidu.com
PS:使用多个过滤器的话就像上面一样添加就行,filter-mapping 元素
的顺序决定了 Web 容器应用过滤器到Servlet 的顺序
⑧Servlet 错误处理程序实例
File-->New-->Servlet
创建一个ErrorHandler
实例ErrorHandler.java
中的doGet()方法
中添加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
37Throwable throwable = (Throwable)
request.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer)
request.getAttribute("javax.servlet.error.status_code");
String servletName = (String)
request.getAttribute("javax.servlet.error.servlet_name");
if (servletName == null){
servletName = "Unknown";
}
String requestUri = (String)
request.getAttribute("javax.servlet.error.request_uri");
if (requestUri == null){
requestUri = "Unknown";
}
response.setContentType("text/html;charset=UTF-8"); // 设置响应内容类型
PrintWriter out = response.getWriter();
String title = "Error/Exception 信息";
String docType = "<!DOCTYPE html>\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n");
if (throwable == null && statusCode == null){
out.println("<h2>错误信息丢失</h2>");
out.println("请返回 <a href=\"" +
response.encodeURL("http://localhost:8080/") + "\">主页</a>。");
}else if (statusCode != null) {
out.println("错误代码 : " + statusCode);
}else{
out.println("<h2>错误信息</h2>");
out.println("Servlet Name : " + servletName + "</br></br>");
out.println("异常类型 : " + throwable.getClass( ).getName( ) + "</br></br>");
out.println("请求 URI: " + requestUri + "<br><br>");
out.println("异常信息: " + throwable.getMessage( ));
}
out.println("</body>");
out.println("</html>");在
web.xml
中添加1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<servlet>
<servlet-name>ErrorHandler</servlet-name>
<servlet-class>cn.sheng.test.ErrorHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ErrorHandler</servlet-name>
<url-pattern>/test/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/test/ErrorHandler</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type >
<location>/ErrorHandler</location>
</error-page>访问
http://localhost:8080/test/ErrorHandler/12
,可以看到错误代码 : 404