JavaWeb-08 (JavaWeb-Servlet基础&java web之request/respone)
来源:互联网 发布:炉石传说 朝神 知乎 编辑:程序博客网 时间:2024/04/28 00:37
JavaWeb-08 JavaWeb-Servlet基础&java web之request/respone
JavaWeb-Servlet基础
一、ServletConfig对象
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
实验1:day0800servletConfig
工程架构:
工程下的web.xml文件内容
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" 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_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>ServletConfig1</servlet-name> <servlet-class>com.heima.servletConfig.ServletConfig1</servlet-class> </servlet> <servlet> <servlet-name>ServletConfig2</servlet-name> <servlet-class>com.heima.servletConfig.ServletConfig2</servlet-class> <init-param> <param-name>姓名</param-name> <param-value>张无忌</param-value> </init-param> <init-param> <param-name>年龄</param-name> <param-value>20</param-value> </init-param> <init-param> <param-name>性别</param-name> <param-value>男</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ServletConfig1</servlet-name> <url-pattern>/servlet/ServletConfig1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletConfig2</servlet-name> <url-pattern>/servlet/ServletConfig2</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
ServletConfig1.java
import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示获取ServletConfig对象/** * 方法一:采用init方法获取 * 方法二:采用getServletConfig()方法获取 * @author Administrator * */public class ServletConfig1 extends HttpServlet { private ServletConfig config ; @Override public void init(ServletConfig config) throws ServletException { this.config = config ; super.init(config) ; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ServletConfig config1 = getServletConfig() ; System.out.println(config == config1); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在配置完服务器后,在浏览器输入http://localhost:8080/day0800servletConfig/servlet/ServletConfig1
输出结果:
true,证明config和 config1 是同一个对象
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
ServletConfig2.java
import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示获取配置信息public class ServletConfig2 extends HttpServlet { private ServletConfig config ; @Override public void init(ServletConfig config) throws ServletException { this.config = config ; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //演示获取单个配置信息 //String name = config.getInitParameter("姓名") ; //System.out.println(name ); //演示获取所有的配置参数 Enumeration<String> enu = config.getInitParameterNames() ; while(enu.hasMoreElements()){ String key = enu.nextElement() ; System.out.println(key+ ":" + config.getInitParameter(key)); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
二、ServletContext对象
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
实验2:/day0801servletContext
工程架构如下:
工程中的web.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" 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_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>ServletContext1</servlet-name> <servlet-class>com.heima.servletcontext.ServletContext1</servlet-class> </servlet> <servlet> <servlet-name>ServletContext2</servlet-name> <servlet-class>one.ServletContext2</servlet-class> </servlet> <servlet> <servlet-name>ServletContext3</servlet-name> <servlet-class>one.ServletContext3</servlet-class> </servlet> <servlet> <servlet-name>ServletContext4</servlet-name> <servlet-class>two.ServletContext4</servlet-class> </servlet> <servlet> <servlet-name>ServletContext5</servlet-name> <servlet-class>three.ServletContext5</servlet-class> </servlet> <servlet> <servlet-name>ServletContext6</servlet-name> <servlet-class>three.ServletContext6</servlet-class> </servlet> <servlet> <servlet-name>ServletContext7</servlet-name> <servlet-class>four.ServletContext7</servlet-class> </servlet> <context-param> <param-name>name</param-name> <param-value>东西方不败</param-value> </context-param> <context-param> <param-name>sex</param-name> <param-value>人妖</param-value> </context-param> <servlet-mapping> <servlet-name>ServletContext1</servlet-name> <url-pattern>/servlet/ServletContext1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletContext2</servlet-name> <url-pattern>/servlet/ServletContext2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletContext3</servlet-name> <url-pattern>/servlet/ServletContext3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletContext4</servlet-name> <url-pattern>/servlet/ServletContext4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletContext5</servlet-name> <url-pattern>/servlet/ServletContext5</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletContext6</servlet-name> <url-pattern>/servlet/ServletContext6</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletContext7</servlet-name> <url-pattern>/servlet/ServletContext7</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
ServletContext1.java
import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示获取servletContext对象的方法/** * 方法一: 采用ServletConfig对象获取 * 方法二: 采用getServletContext()方法 * 方法二: 采用request.getSession().getServletContext() 获取 * @author Administrator * */public class ServletContext1 extends HttpServlet { private ServletContext sc ; @Override public void init(ServletConfig config) throws ServletException { sc = config.getServletContext() ; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //方式二 // sc = getServletContext() ; ServletContext sc1 = request.getSession().getServletContext() ; System.out.println(sc == sc1); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器里输入:http://localhost:8080/day0801servletContext/servlet/ServletContext1,
得出结果:true,证明sc和sc1是同一个对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
三、ServletContext应用
多个Servlet通过ServletContext对象实现数据共享。
ServletContext2.java
import java.io.IOException;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示在servletContext对象共享数据public class ServletContext2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ServletContext sc = getServletContext(); sc.setAttribute("name", "东方不败"); System.out.println("数据存储完毕"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
ServletContext3.java
import java.io.IOException;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//从servletContext中拿取数据public class ServletContext3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ServletContext sc = getServletContext(); String name = (String) sc.getAttribute("name"); System.out.println(name); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
当在浏览器中输入 http://localhost:8080/day0801servletContext/servlet/ServletContext2后观察服务器的结果是:数据存储完毕。然后再在浏览器中输入 http://localhost:8080/day0801servletContext/servlet/ServletContext3,
结果为:东方不败。测试成功。
获取WEB应用的初始化参数。
ServletContext4.java
import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示获取全局配置参数public class ServletContext4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ServletContext sc = getServletContext(); // 演示获取单个配置参数 // String name = sc.getInitParameter("name") ; // System.out.println(name); // 演示拿取多个配置参数 Enumeration<String> enu = sc.getInitParameterNames(); while (enu.hasMoreElements()) { String key = enu.nextElement(); System.out.println(key + " :" + sc.getInitParameter(key)); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器输入:http://localhost:8080/day0801servletContext/servlet/ServletContext4,服务器结果为: sex :人妖 name :东西方不败 测试成功。
实现Servlet的转发。
ServletContext5.java
import java.io.IOException;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示请求转发public class ServletContext5 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 获取全局对象 ServletContext sc = getServletContext(); // 获取请求转发器 RequestDispatcher rd = sc .getRequestDispatcher("/servlet/ServletContext6"); /** * URL的写法: 1. 客户端跳转: 由浏览器跳转 :超链,重定向 : 一定要加工程路径 2. 服务器跳转 : 由服务器发出来的跳转 : * 请求转发 : 不要加工程路径 */ // 转发 rd.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
ServletContext6.java
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ServletContext6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("我喜欢芙蓉姐姐"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
当在浏览器中输入 http://localhost:8080/day0801servletContext/servlet/ServletContext5后观察 结果是:
利用ServletContext对象读取资源文件。
.properties文件(属性文件)得到文件路径(ServletContext.getRealPath(),ServletContext.getReaourceAsStream())
在工程构架中的Properties文件内容如下:
ServletContext7.java
import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.net.URL;import java.util.Properties;import java.util.ResourceBundle;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示获取不同路径下的资源/** * 第一种:采用servletContext获取资源 第二种:采用ResourceBundle类获取 : 不能拿取web环境下的资源 * 第三种:采用类加载器加载资源 :不能拿取web环境下的资源 * * 比较: 第一种方式获取任意资源,任意路径. 第二种方式 只能获取properties类型的资源,web环境下的资源拿不到 * 第三种方式拿取任意资源,不能拿取web环境下的资源 */public class ServletContext7 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ServletContext sc = getServletContext(); try { // test11(sc) ; // test12(sc) ; // test13(sc) ; // test21() ; // test22() ; // test31() ; // test32() ; test33(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } // 方式一: 用servletContext对象获取p2的内容 public void test11(ServletContext sc) throws Exception { // 拿到p2文件的路径 String path = sc.getRealPath("/WEB-INF/classes/p2.properties"); System.out.println(path); // 创建一个输入字节流对象 FileInputStream fis = new FileInputStream(path); // 加载文件 Properties pro = new Properties(); pro.load(fis); // 获取内容 System.out.println(pro.getProperty("k1")); } // 方式一: 用servletContext对象获取p1的内容 public void test12(ServletContext sc) throws Exception { // 拿到p2文件的路径 String path = sc.getRealPath("/WEB-INF/classes/four/p1.properties"); System.out.println(path); // 创建一个输入字节流对象 FileInputStream fis = new FileInputStream(path); // 加载文件 Properties pro = new Properties(); pro.load(fis); // 获取内容 System.out.println(pro.getProperty("k1")); } // 方式一: 用servletContext对象获取p3的内容 public void test13(ServletContext sc) throws Exception { // 拿到p2文件的路径 String path = sc.getRealPath("/WEB-INF/p3.properties"); System.out.println(path); // 创建一个输入字节流对象 FileInputStream fis = new FileInputStream(path); // 加载文件 Properties pro = new Properties(); pro.load(fis); // 获取内容 System.out.println(pro.getProperty("k1")); } // 方式二: 对象获取p2的内容 public void test21() { // 获取resourceBundle对象 ResourceBundle rb = ResourceBundle.getBundle("p2"); // 默认的路径是src,对应服务器上的路径是classes System.out.println(rb.getString("k1")); } // 方式二: 对象获取p1的内容 public void test22() { // 获取resourceBundle对象 ResourceBundle rb = ResourceBundle.getBundle("four.p1"); // 默认的路径是src,对应服务器上的路径是classes System.out.println(rb.getString("k1")); } // 方法三:采用类加载器获取p2的内容 public void test31() throws Exception { // ServletContext7.class // this.getClass() ; // class.forName("four.ServletContext7") ; InputStream is = ServletContext7.class.getClassLoader() .getResourceAsStream("p2.properties"); // 默认的路径是src,对应服务器上的路径是classes // 加载文件 Properties pro = new Properties(); pro.load(is); // 获取内容 System.out.println(pro.getProperty("k1")); } // 方法三:采用类加载器获取p1的内容 public void test32() throws Exception { // ServletContext7.class // this.getClass() ; // class.forName("four.ServletContext7") ; InputStream is = ServletContext7.class.getClassLoader() .getResourceAsStream("four/p1.properties"); // 默认的路径是src,对应服务器上的路径是classes // 加载文件 Properties pro = new Properties(); pro.load(is); // 获取内容 System.out.println(pro.getProperty("k1")); } // 方法三:采用类加载器获取p1的内容 public void test33() throws Exception { // ServletContext7.class // this.getClass() ; // class.forName("four.ServletContext7") ; URL url = ServletContext7.class.getClassLoader().getResource( "four/p1.properties");// 默认的路径是src,对应服务器上的路径是classes String path = url.getPath(); InputStream is = new FileInputStream(path); // 加载文件 Properties pro = new Properties(); pro.load(is); // 获取内容 System.out.println(pro.getProperty("k1")); }}
request&response
一、简介
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向容器输出数据,只需要找response对象就行了。
HttpServletResponse:HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
二、response常见应用:
1、向客户端输出中文数据:
用OutputStream(字节流)发送数据:
a、response.getOutputStream().write(“中国”.getBytes());//以默认编码发送数据b、response.getOutputStream().write("中国".getBytes("UTF-8"));//以UTF-8编码发送数据,浏览器(默认用GB2312)会出现乱码
画图描述出现该问题的原因。
解决办法:
a. 通过更改浏览器的编码方式:IE/”查看”/”编码”/”UTF-8”(不可取)b. 通过设置响应头告知客户端编码方式:response.setHeader(“Content-type”, “text/html;charset=UTF-8”);//告知浏览器数据类型及编码c. 通过meta标签模拟请求头:out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());d. 通过以下方法:response.setContentType("text/html;charset=UTF-8");
总结:程序以什么编码输出,就需要告知客户端以什么编码显示。
用PrintWriter(字符流)发送数据:
示例:response.getWriter().write(“中国” );有没有乱码?
原因:以默认编码发送数据 ISO-8859-1(没有中国二字编码),此时会发生乱码
解决办法:
setCharacterEncoding(“UTF-8”);//更改编码为UTF-8response.setHead(“Context-type”,”text/html;charset=UTF-8”);//告诉客户端编码方式注意:不要忘记告诉客户端的编码方式。由于经常改动编码,response提供了一种更简单的方式response. setContentType(“text/html;charset=UTF-8”);其作用相当于以上两条代码。
实验:/day0802httpServletResponse
工程架构如图:
工程中的web.xml文档内容如下:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name></display-name> <servlet> <servlet-name>ServletResponse1</servlet-name> <servlet-class>com.heima.response.ServletResponse1</servlet-class> </servlet> <servlet> <servlet-name>ServletResponse2</servlet-name> <servlet-class>com.heima.response.ServletResponse2</servlet-class> </servlet> <servlet> <servlet-name>ServletResponse3</servlet-name> <servlet-class>com.heima.response.ServletResponse3</servlet-class> </servlet> <servlet> <servlet-name>ServletResponse4</servlet-name> <servlet-class>com.heima.response.ServletResponse4</servlet-class> </servlet> <servlet> <servlet-name>ServletResponse5</servlet-name> <servlet-class>com.heima.response.ServletResponse5</servlet-class> </servlet> <servlet> <servlet-name>ServletResponse6</servlet-name> <servlet-class>com.heima.response.ServletResponse6</servlet-class> </servlet> <servlet> <servlet-name>ServletResponse7</servlet-name> <servlet-class>com.heima.response.ServletResponse7</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletResponse1</servlet-name> <url-pattern>/servlet/ServletResponse1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletResponse2</servlet-name> <url-pattern>/servlet/ServletResponse2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletResponse3</servlet-name> <url-pattern>/servlet/ServletResponse3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletResponse4</servlet-name> <url-pattern>/servlet/ServletResponse4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletResponse5</servlet-name> <url-pattern>/servlet/ServletResponse5</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletResponse6</servlet-name> <url-pattern>/servlet/ServletResponse6</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletResponse7</servlet-name> <url-pattern>/servlet/ServletResponse7</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>
ServletResponse1.java
import java.io.IOException;import java.io.UnsupportedEncodingException;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示中文乱码的解决public class ServletResponse1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// Test1(response); test2(response); } //字节流输出中文 private void Test1(HttpServletResponse response) throws IOException, UnsupportedEncodingException { //演示字节流输出中文 ServletOutputStream sos = response.getOutputStream() ; //方法一:告诉用户自己选择编码(不靠谱) //方法二:通知浏览器采用哪个码表 //response.setHeader("Content-Type", "text/html;charset=UTF-8") ; //方式三:输出字符串 //sos.write("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>".getBytes()) ; //方法四:通知服务器用的编码,同时告诉浏览器用的码表 //response.setCharacterEncoding("UTF-8") ; //response.setHeader("Content-Type", "text/html;charset=UTF-8") ; //方法五: (推荐) response.setContentType("text/html;charset=UTF-8") ; //此句话有两个作用: 1.告诉服务器发送数据的的时候的编码 // 2. 通知浏览器解码的时候所用的码表 sos.write("林志玲3".getBytes("UTF-8")) ; } //演示字符流输出中文 public void test2(HttpServletResponse response){ response.setContentType("text/html;charset=UTF-8") ; try { response.getWriter().write("陈冠希") ; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器输入http://localhost:8080/day0802httpServletResponse/servlet/ServletResponse1
结果:
2、演示中文文件名的下载:
ServletResponse2.java
import java.io.FileInputStream;import java.io.IOException;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示中文文件名的下载public class ServletResponse2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); //拿到图片的绝对路径 String path = getServletContext().getRealPath("/WEB-INF/classes/美女.jpg") ; //创建一个输入流 FileInputStream fis = new FileInputStream(path) ; //创建一个输出流 ServletOutputStream sos = response.getOutputStream() ; //截取中文文件名 String filename = path.substring(path.lastIndexOf("\\") + 1) ; //通知浏览器以下载的方式打开 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename,"UTF-8")) ; //通知浏览器文件名的MIME类型 response.setHeader("Content-Type", "application/octet-stream") ; //输送数据 byte[] bs = new byte[1024] ; int b = 0 ; while((b = fis.read(bs)) != -1){ sos.write(bs,0,b) ; } fis.close() ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器中输入:http://localhost:8080/day0802httpServletResponse/servlet/ServletResponse2
结果如图:
3、验证码实验
a. 输出随机图片(CAPTCHA图像):Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的测试) b. 相关主要类(JDK 查看API) BufferedImage:内存图像 Graphics:画笔 ImageIO:输出图像 放在html页面上<img src/> 注意:浏览器默认会缓存图片 控制客户端不要缓存: response.addHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Expires", "0");c. js刷新图片
MyHtml.html
<!DOCTYPE html><html> <head> <title>MyHtml.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/./styles.css">--> </head> <script type="text/javascript"> function changeImage(){ //拿到图片对象 var image = document.getElementById("img") ; //设置src属性 image.src = "/day08_02_httpServletResponse/servlet/ServletResponse3?t=" +new Date() ; } </script> <body> <form action="" method="post"> <table border =1 > <tr> <td><br><br> 姓名:</td> <td><input type = "text" name = "username"></td> </tr> <tr> <td>密码:</td> <td><input type = "password" name = "pass"></td> </tr> <tr> <td>请输入验证码:</td> <td><input type = "text" name = "code"> <img src = "/day08_02_httpServletResponse/servlet/ServletResponse3" id = "img"> <a href = "javascript:changeImage()">看不清楚,换一张</a></td> </tr> </table> </form> </body></html>
ServletResponse3.java
import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示验证码的生成public class ServletResponse3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置图片的宽度,高度 int width = 120 ; int height = 30 ; //创建图片 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB) ; //拿到图片的画笔 Graphics g = image.getGraphics() ; //设置边框的颜色 g.setColor(Color.RED) ; //将图片画出来 g.drawRect(0, 0, width, height) ; //填充一下背景 g.setColor(Color.yellow) ; //填充背景 g.fillRect(1, 1, width-2, height-2) ; //画4个数字 Random r = new Random() ; g.setColor(Color.red) ; g.setFont(new Font("幼圆", Font.BOLD + Font.ITALIC, 18)) ;// for (int i = 0; i < 4; i++) {// g.drawString(r.nextInt(10) + "", 20 + i*20, 20) ;// } //随机画30条干扰线 g.setColor(Color.gray) ; for (int i = 0; i < 30; i++) { g.drawLine(r.nextInt(width), r.nextInt(height),r.nextInt(width), r.nextInt(height)) ; } //画中文 g.setColor(Color.red) ; String s = "中国好声音深圳黑鸟训练营Ilovemoney" ; s = "\u4E2D\u56FD\u597D\u58F0\u97F3\u6DF1\u5733\u9ED1\u9A6C\u8BAD\u7EC3\u8425Ilovemoney" ; for (int i = 0; i < 4; i++) { g.drawString(s.charAt(r.nextInt(s.length())) + "", 20 + i*20 + r.nextInt(5), 18 + r.nextInt(5)) ; } response.setHeader("Expires", "-1") ; response.setHeader("Cache-Control", "no-cache") ; //使用1.1协议 response.setHeader("Pragma", "no-cache") ; //使用1.0协议 //创建imageIO对象 ImageIO.write(image, "jpg", response.getOutputStream()) ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器中输入:http://localhost:8080/day0802httpServletResponse/MyHtml.html
输出结果:
4、用request演示刷新
ServletResponse4.java
import java.io.IOException;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示刷新public class ServletResponse4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //定时刷新自己 //response.setHeader("Refresh", "2") ; //response.getWriter().write("abcd" + new Random().nextInt()) ; //定时刷新到其他页面 response.setHeader("Refresh", "2;url=/day08_02_httpServletResponse/MyHtml.html") ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器中输入:http://localhost:8080/day0802httpServletResponse/servlet/ServletResponse4
输出结果:2秒后刷新到另一个页面中:
5、用request控制浏览器缓存时间
ServletResponse5.java
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//控制浏览器缓存时间public class ServletResponse5 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getOutputStream().write("大家好".getBytes()) ; response.setDateHeader("Expires", System.currentTimeMillis() + 10000) ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器中输入:http://localhost:8080/day0802httpServletResponse/servlet/ServletResponse5
结果:
6、用request演示请求重定向
ServletResponse6.java
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示请求重定向public class ServletResponse6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //第一种方式 //response.setStatus(302) ; //response.setHeader("Location", "/day08_02_httpServletResponse/servlet/ServletResponse3") ; //第二种方式 response.sendRedirect("/day08_02_httpServletResponse/servlet/ServletResponse3") ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器中输入:http://localhost:8080/day0802httpServletResponse/servlet/ServletResponse6 结果页面重定向到了http://localhost:8080/day0802httpServletResponse/servlet/ServletResponse3
如图:
重定向的流程如下:
流程1
流程2
流程3
流程4
流程5
流程6
流程7
流程8
流程9
流程10
流程11
流程12
流程13
流程14
流程15
流程16
7、response细节:
a. getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。b. getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 会抛异常。c. Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。 d. Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
ServletResponse7.java
package com.heima.response;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//演示response细节public class ServletResponse7 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.getWriter().write("aaaaaaaaaaaaaaaaaaa") ; //response.getOutputStream().write("大s".getBytes()) ; response.getOutputStream().write((65+"").getBytes()) ; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }}
在浏览器中输入:http://localhost:8080/day0802httpServletResponse/servlet/ServletResponse7
结果:
资料下载
- JavaWeb-08 (JavaWeb-Servlet基础&java web之request/respone)
- Java Web 之 Request Respone
- JavaWEB基础之Servlet
- javaweb基础之--Servlet
- javaweb基础之servlet
- [Java拾遗三]JavaWeb基础之Servlet
- Javaweb基础之response&request
- JavaWeb基础学习之servlet
- Javaweb基础之Servlet学习
- JavaWeb之servlet的request对象
- javaweb-servlet-request方法
- java web中的request和respone
- JavaWeb-开发基础-web、环境、jsp、servlet
- JavaWeb之Request
- Javaweb核心之request
- JavaWeb(三)------servlet基础
- JavaWeb-----1.Servlet基础
- 10.JavaWeb基础 Servlet
- ubuntu 常用命令
- POJ-1002
- Django资源大全
- mysql中engine=innodb和engine=myisam的区别
- alsa capture
- JavaWeb-08 (JavaWeb-Servlet基础&java web之request/respone)
- [Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]
- win7+vs2013+cygwin编译webkit源代码
- 第四周 项目1-3 求三角形面积(有默认参数的构造函数)
- 相关系数法
- lamp环境与框架搭建
- Python爬虫抓取图片,网址从文件中读取
- 2015,3,31
- Myeclipse10安装Aptana