Request & Reponse学习
文章目录
1. 复习http&sevlet
-
http协议
- 客户端和服务端的一种通讯规则
- request:
- 请求头
- 请求行
- 请求体
- response
- 响应行
- 响应头
- 响应体
- Get
- 带上的数据,在url上拼接的
- www.url.com
- name=zhangsan
- age=18
url:www.url.com?name=zhangsan&age=18
- 安全隐患
- Post
- 以流的方式写过去,数据无限制
- Conten-Type:带过来数据类型
- Conten-Length:数据长度
-
Servlet入门
-
新建类实现servlet接口
-
web.xml注册
-
<servlet> <servelt-name> 自定义名字</servelt-name> <servlet-class>类的地址 </servlet-class> <init-params>不是必须的</init-params> </servlet> <servelt-mapping> <servlet-name></servlet-name> <url-patter>以正斜杠打头</url-patter> </servelt-mapping>
-
servlet生命周期
-
init
-
默认情况下,初始化的时候执行
-
提前:服务器启动的时候
-
<serclet> <load-on-startuo> 2 </load-on-startuo> </serclet>
-
-
service
- 只要又请求过来,就会执行
-
destory
- 从服务器移除托管
- 正常关闭服务器
-
通用servelt的写法
- 协议给类继承HttpServlet类
- doGet()
- doPost()
- 在service方法内,会对来访的请求进行判断,是get则给doGet方法,,是post则给doPost()
- HttpServlet是抽象类,但是没有抽象方法
- 协议给类继承HttpServlet类
-
-
2. Request & Reponse
2.1 Servelt配置方式一
- 新建动态web项目
- 新建一个servelt
- 直接发布
- 全路径匹配
- 以
/
开头
- 以
- 路径匹配(前半段匹配)
- 以
/
开头,但是以*
结束
- 以
- 以扩展名匹配
*.aa
2.2 ServletContext(接口)
servlet 上下文
每一个web工程都只有一个ServletContext对象,不管在同一个工程里哪里servlet里面,获取到的这个类的对象都是同一个,指向用一块内存地址。
-
新建动态web工程
-
新建servlet
-
得到对象,在doGet方法里写上
ServletContext context = new ServletContext();
- `String address = context.getServletParameter(“address”);
print(address);
-
然后在web.xml里注册
-
新建一个类复制上面代码,同时注册。
-
在web.xml
-
<context-param> <param-name>address</param-name> <param-value>地址</param-value> </context-param>
-
-
访问第一个servlet,在访问第二个servlet。控制台发现数据一样。从而证明:
-
每一个web工程都只有一个ServletContext对象,不管在同一个工程里哪里servlet里面,获取到的这个类的对象都是同一个,指向用一块内存地址。
-
2.3 ServletContext有什么用
-
获取全局参数
-
获取web工程中资源
-
新建servlet
-
在src下新建一个
config.propertites
并初始化- name=“zhangsan”
-
在doGet方法下
-
//1.创建属性对象 Properties propertites = new Properties(); //2.指定载入的数据流 /* * 如果此处想获取web工程下的资源,用普通的FileInputStream写访问不到 * 因为路径不对了。这里相对路径是根据jre来确定的,但我们这里是一个web工程 * jre后面会被tomcat管理,所以这里真正的相对路径是tomcat里卖弄的bin目录 */ InputSteam is = new FileInputStream("classes/config.propertites"); properties.load(is); //3.获取name的属性值 String name = properties.getProperty("name"); printf(name);
-
-
这个实验视频中没有做出来,他说这样配置后在web中能访问。回头试一下
-
这里目的是想引出来使用ServletContext来进行配置
-
方法1:获取web工程中的参数
-
新建一个动态web工程
-
在WebContent路径下新建文件夹
file
,然后在里面新建config.propertites
并初始化- [外链图片转存失败(img-6CbSuo3n-1565624176754)(C:\Users\cds\AppData\Roaming\Typora\typora-user-images\1558539584533.png)]
-
新建一个servlet,在doGet方法下
-
getRealPath():拿去绝对路径
-
//1. 获取ServletContext对象 ServletContext context = getServletContext(); // 获取给定的文件,在服务器上的绝对路径 //如果在context.getRealPath("")中什么都不写 //返回的是wtpwebapps\工程名 的路径下 // context.getRealPath("file/config.propertiers"); //返回的是config.propertiers绝对路径 String path = context.getRealPath("file/config.propertiers"); printf(path); //2.创建属性对象 Properties propertites = new Properties(); //3.指定载入的数据流 InputSteam is = ; properties.load(is); //4.获取name的属性值 String name = properties.getProperty("name"); printf(name);
-
-
发布,web中访问。
方法二::getResourceAsStream 获取资源的流对象
//1. 获取ServletContext对象
ServletContext context = getServletContext();
//2.创建属性对象
Properties propertites = new Properties();
//3.获取web工程下的资源,转化为流对象,前面隐藏当前工程的根目录
InputSteam is =context.getResourceAsSteam("file/config.propreties") ;
properties.load(is);
//4.获取name的属性值
String name = properties.getProperty("name");
//5.关闭流
is.close();
printf(name);
**方法三:**根据classloader去获取工程下的资源 类加载器(JDBC)
3. 存取数据,servlet之间共享数据,域对象
需求:
1. 获取网站的登陆总人数
[外链图片转存失败(img-zIo8o3vy-1565624176757)(C:\Users\cds\AppData\Roaming\Typora\typora-user-images\1558833256549.png)]
-
新建一个动态工程Demo4
-
webCotent下新建login.html
-
<h2> 请输入以下内容,完成登陆 </h2> <form action="LonginServlet" method="get"> 账号:<input type = "text" name = "username" /> <br> 密码:<input type = "text" name = "password" /> <br> <input tyoe = "submit" value = "登陆"> </form> 在这里action下的名字是servelt再web.xml中注册的url-partter的名字
-
-
新建一个servlet,命名为LonginServlet.java
-
发布,访问Demo04/longin.html
-
在servlet的doGet方法下
-
/** * request:包含请求信息 * *response:响应数据给浏览器 */ //1. 获取数据 String userName = request.getParameter("username"); String passWord = request.getParameter("password"); //2. 校验数据 // 向浏览器输出内容 PrintWriter pw = response.getWriter(); if("admin".equals(userName) && "123".equals(passWord)) { System.out.println("登陆成功"); System.out.println(userName + ":" + passWord); System.out.println(userName + ":" + passWord); pw.write("log in "); //1.成功次数累加 //取以前的值。然后再旧的基础上+1 //int toalCount = (int)getServletContext().getAttribute("count "); Objetc obj = getServeltContext().getAttribute("count"); int totalCount =0; if(obj != null){ totalCount = (int) obj; } //给合格count赋新值 getServletContext().setAttribute("count",totalcount+1); //设置状态码,重新定位状态码 response.setStatus(302); //定位跳转的位置是哪一个页面 response.setHeader("Location","login_success.html"); }else { System.out.println("登陆失败"); pw.write("faild"); }
-
浏览器在访问此html并填写信息
-
-
新建login_success.html
-
//设置状态码,重新定位状态码 response.setStatus(302); //定位跳转的位置是哪一个页面 response.setHeader("Location","login_success.html");
-
<h2> 登陆成功 </h2> <a hreg = "CountServelt" > 网站登陆的总成功数</a>
-
再次访问,发现跳转
-
[外链图片转存失败(img-06OM8f9S-1565624176760)(C:\Users\cds\AppData\Roaming\Typora\typora-user-images\1558854203480.png)]
-
-
新建一个CountServlet的servlet
-
int count = (int)getServletContext().getAttbute("count"); response.getWriter("当前网站成功登陆总次数为:" + count)
-
<h2> 登陆成功 </h2> <a hreg = "CountServelt" > 网站登陆的总成功数</a>
-
2.4 servletContext生命周期
- 服务器启动的时候,会为托管的每一个web应用程序,创建一个servletContext对象
- 从服务器移除托管,或者关闭处理服务器时销毁对象
- ServletContext作用范围
- 只要再这个项目里面,都可以取
3. HttpServletRequest
这个对象封装了客户端提交功过来了的一切数据
-
新建动态web工程
-
新建servlet
-
doGet方法下
-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //去除请求里面的所有信息 //枚举集合 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = (String) headerNames.nextElement(); String value = request.getHeader(name); System.out.println(name + " = " + value); } }
-
http://localhost:8080/Requeest_Response01/Request01?name=name
-
//1. 获取请求头 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = (String) headerNames.nextElement(); String value = request.getHeader(name); System.out.println(name + " = " + value); } //2.获取客户端提交上来的数据 String name = request.getParameter("name"); System.out.println("name = " + name );
-
-
获取客户端提交过来的数据
//2. 获取到的是客户端提交上来的数据
String name = request.getParameter("name");
String address = request.getParameter("address");
System.out.println("name="+name);
System.out.println("address="+address);
System.out.println("-----------------------");
// 获取所有的参数,得到一个枚举集合
// Enumeration<String> parameterNames = request.getParameterNames();
// name=zhangsan&address=beijing
//name=zhangsan&name=lisi&name=wangwu
Map<String, String[]> map = request.getParameterMap();
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
System.out.println("key="+key + "--的值总数有:"+map.get(key).length);
String value = map.get(key)[0];
String value1 = map.get(key)[1];
String value2 = map.get(key)[2];
System.out.println(key+" ======= "+ value + "=" + value1 + "="+ value2);
}
4. 下载
- 新建一个html和servlet
HTML,命名为index.html代码
<body>
<h3>让默认的servlet下载(tomcat)</h3><br>
<a href = "download/a.txt">a.txt</a><br>
<a href = "download/a.txt">b.txt</a><br>
<h3>手动编码形式</h3><br>
<a href = "demo1_dowmload?fileName=a.txt">a.txt</a><br>
<a href = "demo1_dowmload?fileName=b.txt">b.txt</a><br>
</body>
</html>
servlet代码,命名为:demo1_download.java
package com.cds.download;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.jni.FileInfo;
import com.sun.corba.se.spi.activation.Repository;
/**
* Servlet implementation class demo1_dowmload
*/
@WebServlet("/demo1_dowmload")
public class demo1_dowmload extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取要下载文件的名字
String fileName = request.getParameter("fileName");
//2.获取绝对路径
String path = getServletContext().getRealPath("download/" + fileName);
//3.设置浏览器展示方式
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
//4.转化为输出流
InputStream in = new FileInputStream(path);
OutputStream out = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len = in.read(b)) != -1) {
out.write(b,0,len);
}
out.close();
in.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}