演示ServletConfig–读取web.xml中的配置
获得servlet的初始化的配置参数,有三种方法中:
1 getInitParameter("name");
2 getServletConfig().getInitParameter("name");
3 在不知道参数名称的情况下: Enumeration<String> en = getServletConfig().getInitParameterNames();
然后去遍历读取
while(en.hasMoreElements()){
String key = en.nextElement();
String value = getServletConfig().getInitParameter(key);
out.println(key+":"+value);
}
演示ServletContext
getServletContext 用于整个项目的容器。通过setAttribute
和getAttribute
去读写。
网站访问量: 定义一个Integer对象,通过getServletContext().getAttribute("count")
去读写这个count 。如果不存在就count=1,否则就count++。因为getServletContext是作用于整个项目,所以读写的count即使是不同浏览器不同的request每次都会加。
留言板:将request.getParameter("info");
拿到的信息通过setAttribute
写到getServletContext 中去。然后通过getServletContext 的getAttribute
去拿之前写的。这样就达到了所有用户都能看到留言。
演示ServletContext—图片浏览
这里有一个知识点:获取服务器目录中的绝对路径。通过getServletContext().getRealPath("/imgs");
返回的就是资源的的绝对路径,中间的参数是项目根目录下的路径。
知识点1:获取初始化参数注意细节
通过thsi.getInitParamer()获取的是一个Servlet的初始化配置参数
通过getServletContext.getInitParamer()获取的是整个项目的初始化配置参数
知识点2:配置默认的servlet
在web.xml中配置servlet时,如果在 <servlet-mapping>
中的<url-pattern>
只输入一个”\” ,那么当我们这个项目的路径名不存在的时候就显示此页面。在测试的时候一般不配置,因为我们配置之后我们就看不到错误信息,通常在发布后配置,使用户即使输入错误时,不是已在在等待很久之后才显示网站空白或者不存在,而是导向我们配置的这个界面。
演示ThreadServlet—线程
(通过两个浏览器分别发一个上传用户名的请求)输出结果,可会出现:第一个请求显示出的name是第二个请求上传的参数值。这说明servlet在Tomcat中其实是单例,多个请求其实是共享servlet池中的同一个对象,因此该对象中的成员变量是共享的,容易出现串数据。尤其是servlet功能比较复杂的时候,可能会写多个方法,然后以要共用变量,很可能会想到把它定义成成员变量,这时就是一个坑!!!—–应该通过别的办法去解决,如通过方法参数传递,,数据库
演示图片下载
图片文件应该放在webRoot文件下
我们应该设置两个响应头:
设置响应头1–内容接收程序–浏览器看到这个响应头,就会把它认为的下载程序打开(如果识别迅雷那么就会自动打开迅雷,如果没有其它的则打开一个“文件另存为”的对话框。
设置响应头2–告诉浏览器:文件名+文件类型 ,注意,“attachment;” 不能少,否则浏览器会直接在新窗口中打开
真正的文件是通过getServletContext().getRealPath("/imgs/3.jpg");//真正下载的文件数据在这里
拿到的,然后通过IO读写
解决文件名带中文的时候,中文乱码问题
设置
fileName = URLEncoder.encode(fileName,"utf-8");
本文代码如下:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>演示servlet的其他相关类</title>
</head>
<body>
<a href="config">演示ServletConfig--读取web.xml中的配置</a>
<a href="context">演示ServletContext---A页面显示网站访问量</a>
<a href="context2">演示ServletContext---B页面显示网站访问量</a>
<hr/>
<a href="msg">演示ServletContext---留言板</a>
<hr/>
<!-- 获取服务器目录中的绝对路径 getRealPath -->
<a href="showImg">演示ServletContext---图片浏览</a>
<hr/>
<a href="thread">演示ThreadServlet---线程</a>
<hr/>
<a href="download">演示图片下载</a>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<servlet>
<servlet-name>ConfigServlet</servlet-name>
<servlet-class>cn.hncu.servlets.ConfigServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>jack</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>21</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>ContextServlet</servlet-name>
<servlet-class>cn.hncu.servlets.ContextServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ContextServlet2</servlet-name>
<servlet-class>cn.hncu.servlets.ContextServlet2</servlet-class>
</servlet>
<servlet>
<servlet-name>MsgServlet</servlet-name>
<servlet-class>cn.hncu.servlets.MsgServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ShowImgServlet</servlet-name>
<servlet-class>cn.hncu.servlets.ShowImgServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ThreadServlet</servlet-name>
<servlet-class>cn.hncu.servlets.ThreadServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>DownServlet</servlet-name>
<servlet-class>cn.hncu.servlets.DownServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ConfigServlet</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ContextServlet</servlet-name>
<url-pattern>/context</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ContextServlet2</servlet-name>
<url-pattern>/context2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MsgServlet</servlet-name>
<url-pattern>/msg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowImgServlet</servlet-name>
<url-pattern>/showImg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ThreadServlet</servlet-name>
<url-pattern>/thread</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DownServlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
ConfigServlet
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用来读取servlet的初始化配置参数
* @author <a href="mailto:wyj950411@foxmail.com">军街</a>
*
* @version 1.0 2016-7-20
*/
public class ConfigServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
* 演示读取servlet中的初始化配置参数
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charser=utf-8");
//方法1
String name1 = this.getInitParameter("name");
String age1 = this.getInitParameter("age");
//方法2
String name2=getServletConfig().getInitParameter("name");
String age2=getServletConfig().getInitParameter("age");
//在不知道参数的情况下通过读取参数 方法3:
Enumeration<String> en = getServletConfig().getInitParameterNames();
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println("name:"+name1);
out.println("age:"+age1);
out.println("<hr/>");
out.println("name:"+name2);
out.println("age:"+age2);
out.println("<hr/>");
while(en.hasMoreElements()){
String key = en.nextElement();
String value = getServletConfig().getInitParameter(key);
out.println(key+":"+value);
}
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
ContextServlet
package cn.hncu.servlets;
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;
/**
* 用于整个项目的容器,这里做了两个小功能,一个是访问量,一个是留言板
* 留言板注意:要把request.getParamer()读到的信息写到ContextServlet这个大的容器中去
*
* @author <a href="mailto:wyj950411@foxmail.com">军街</a>
*
* @version 1.0 2016-7-20
*/
public class ContextServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
* 做网站的访问量
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Integer count = (Integer) getServletContext().getAttribute("count");
if(count == null || count==0){
count=1;
}else{
count++;
}
getServletContext().setAttribute("count", count);
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println("访问人数:"+count);
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
ContextServlet2
package cn.hncu.servlets;
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 ContextServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Integer count = (Integer) getServletContext().getAttribute("count");
if(count == null || count==0){
count=1;
}else{
count++;
}
getServletContext().setAttribute("count", count);
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println("网站目前访问人数:"+count);
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
DownServlet
package cn.hncu.servlets;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
//设置响应头1--内容接收程序--浏览器看到这个响应头,就会把它认为的下载程序打开(如果识别迅雷那么就会自动打开迅雷,
//如果没有其它的则打开一个“文件另存为”的对话框
response.setContentType("application/force-download");
//设置响应头2--告诉浏览器:文件名+文件类型
String fileName = "seber.jpg";
//解决文件名带中文的时候,中文乱码问题
fileName = URLEncoder.encode(fileName,"utf-8");
//注意,“attachment;” 不能少,否则浏览器会直接在新窗口中打开
response.setHeader("Content-Disposition", "attachment;fileName='"+fileName+"'");
//向浏览器发送真正的图片资源
String realPath = getServletContext().getRealPath("/imgs/3.jpg");//真正下载的文件数据在这里
InputStream in = new FileInputStream(realPath);
OutputStream out = response.getOutputStream();
byte[] buf = new byte[1024];
int len= 0;
while( (len=in.read(buf))!=-1){
out.write(buf, 0, len);
}
out.close();
in.close();
}
}
MsgServlet
package cn.hncu.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 做留言板
* @author <a href="mailto:wyj950411@foxmail.com">军街</a>
*
* @version 1.0 2016-7-20
*/
public class MsgServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
* 做一个简单的留言板,应包括日期和ip
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String msgs = (String) getServletContext().getAttribute("msgs");
//日期
SimpleDateFormat sim = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String date = sim.format(new Date());
String ip = request.getRemoteAddr();
String msg = request.getParameter("info");
if(msg==null){
msg="";
}
if(msgs==null){
msgs = msg;
}else{
msgs = msgs+date+" "+ip+"说:"+msg+"<br/>";
}
getServletContext().setAttribute("msgs", msgs);
String form = "<form action='msg' method='post'>" +
"评论:<input type='text' name='info'>"+
"<input type='submit' value='回复'>"+
"</form>";
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.println(msgs);
out.print("<hr/>");
out.println(form);
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
ShowImgServlet
package cn.hncu.servlets;
import java.io.File;
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 ShowImgServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
//获取服务器目录中的绝对路径
String realPath = getServletContext().getRealPath("/imgs");
File file = new File(realPath);
if(!file.exists()||!file.isDirectory()){
return;
}
String[] fileNames = file.list();
for(String fileName:fileNames){
String img = "<img width=200 height=200 src='imgs/"+fileName+"' />";
out.print(img);
}
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
ThreadServlet
package cn.hncu.servlets;
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 ThreadServlet extends HttpServlet {
//本例(通过两个浏览器分别发一个上传用户名的请求)输出结果,可会出现:第一个请求显示出的name是第二个请求上传的参数值。
//本例告诉我们,servlet在Tomcat中其实是单例,多个请求其实是共享servlet池中的同一个对象,因此该对象中的成员变量是共享的,容易出现串数据。
//尤其是servlet功能比较复杂的时候,可能会写多个方法,然后以要共用变量,很可能会想到把它定义成成员变量,这时就是一个坑!!!
//-----应该通过别的办法去解决,如通过方法参数传递,,数据库
private String name;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
name = request.getParameter("name");
try {
Thread.sleep(3000);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
}
response.getWriter().write("name :"+name);
}
}