web与request
request --> 封装了客户端所有的请求数据!
请求行
请求头
空行
请求体(GET没体)
回忆一下http协议!请求协议中的数据都可以通过request对象来获取!
* 获取常用信息
> 获取客户端IP,案例:封IP。
request.getRemoteAddr()//得到IP地址
> 请求方式
request.getMethod(),可能是POST也可能是GET
* 获取HTTP请求头
- ***** String getHeader(String name),适用于单值头
- int getIntHeader(String name),适用于单值int类型的请求头
- long getDateHeader(String name),适用于单值毫秒类型的请求头
- Enumeration<String> getHeaders(String name),适用于多值请求头
案例:
> 通过User-Agent识别用户浏览器类型
//toLowCase().contains();其中toLowCase()是把大小写,contains()是判断字符串是否包含该字节
> 防盗链:如果请求不是通过本站的超链接发出的,发送错误状态码404。Referer这个请求头,表示请求的来源!
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 使用Referer请求头,来访倒链
*/
String referer =request.getHeader("Referer");
System.out.println(referer);
if(referer == null || !referer.contains("localhost")){
response.sendRedirect("http://www.baidu.com");
}else{
System.out.println("hello");
}
* 获取请求URL
http://localhost:8080/day10_2/AServlet?username=xxx&password=yyy
- String getScheme():获取协议,http
- String getServerName():获取服务器名,localhost
- String getServerPort():获取服务器端口,
- *****String getContextPath():获取项目名,/day10_2
- String getServletPath():获取Servlet路径,/AServlet
- String getQueryString():获取参数部分,即问号后面的部分。username=xxx&password=yyy
- String getRequestURI():获取请求URI,等于项目名+Servlet路径。/day10_2/AServlet
- String getRequestURL():获取请求URL,等于不包含参数的整个请求路径。http://localhost:8080/day10_2/AServlet
* 获取请求参数:请求参数是由客户端发送给服务器的!有可能是在请求体中(POST),也可能是在URL之后(GET)
请求参数:有一个参数一个值的,还有一个参数多个值!
- ****String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数
- String[] getParameterValues(String name):获取指定名称的请求参数值,适用于多值请求参数
- Enumeration<String> getParameterNames():获取所有请求参数名称
- *****Map<String,String[]> getParameterMap():获取所有请求参数,其中key为参数名,value为参数值。
案例:超链接参数,表单数据
a.html:
<body>
<a href="/day10_3/AServlet?xxx=XXX&yyy=YYY" >点击这里</a><br>
</hr>
<form action="/day10_3/AServlet" method="post">
用户名: <input type="text" name="user"><br>
密 码: <input type="password" name="password">
爱 好: <input type="checkbox" name="hobby" value="cf"/>吃饭
<input type="checkbox" checked="checked" name="hobby" value="sj"/>睡觉
<input type="checkbox" name="hobby" value="ddm"/>打代码
<br/>
<input type="submit" value="提交"/>
JAVA代码:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取get请求,数据
String xxx=request.getParameter("xxx");
String yyy=request.getParameter("xxx");
System.out.println("Get:"+xxx+"&"+yyy); }
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取post请求,表单内容
String user=request.getParameter("user");
String password=request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println(user+","+password+","+Arrays.toString(hobby));
/*
* 测试获取所有请求参数的名称
*/
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()) {
System.out.println(names.nextElement());
} /*
* 获取所有请求参数,封装到Map中
*/
Map<String,String[]> map = request.getParameterMap();
for(String name : map.keySet()) {
String[] values = map.get(name);
System.out.println(name + "=" + Arrays.toString(values));
}
} }
* 请求转发和请求包含
RequestDispatcher rd = request.getRequestDispatcher("/MyServlet"); // 使用request获取RequestDispatcher对象,方法的参数是被转发或包含 的Servlet的Servlet路径
请求转发:*****rd.forward(request,response);
请求包含:rd.include(request,response);
有时一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
> 一个请求跨多个Servlet,需要使用转发和包含。
> 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体)
> 请求包含:由两个Servlet共同未完成响应体!(都留)
> 无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!
代码:
OneServlet:
public class OneServlet extends HttpServlet { /*
* 演示请求转发
*
* */
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("OneServlet............");
response.setHeader("aaa", "AAAA");//响应头
response.getOutputStream().print("Hello OneServlet");//响应体 //等同于调用TowServlet的servlet
request.getRequestDispatcher("/TowServlet").forward(request, response);//include(request,response);请求包含
} }
TowServlet:
public class TowServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("TowServlet........");
response.getOutputStream().print("Hello TowServlet");//响应体
} }
* request域
Servlet中三大域对象:request、session、application,都有如下三个方法:
> void setAttribute(String name, Object value)
> Object getAttribute(String name)
> void removeAttribute(String name);
> 同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。
OneServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("OneServlet............");
response.setHeader("aaa", "AAAA");//响应头
response.getOutputStream().print("Hello OneServlet");//响应体
request.setAttribute("name", "zhangsan");
//等同于调用TowServlet的servlet
request.getRequestDispatcher("/TowServlet").forward(request, response);
}
}
TowServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("TowServlet........");
System.out.println( request.getAttribute("name"));
response.getOutputStream().print("Hello TowServlet");//响应体
}
}
* 请求转发和重定向的区别
> 请求转发是一个请求一次响应,而重定向是两次请求两次响应
> 请求转发地址栏不变化,而重定向会显示后一个请求的地址
> 请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目
> 请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名!
> 请求转发和重定向效率是转发高!因为是一个请求!
<> 需要地址栏发生变化,那么必须使用重定向!
<> 需要在下一个Servlet中获取request域中的数据,必须要使用转发!
------------------
编码
常见字符编码:iso-8859-1(不支持中文)、gb2312、gbk、gb18030(系统默认编码,中国的国标码)、utf-8(万国码,支持全世界的编码,所以我们使用这个)
1. 响应编码
* 当使用response.getWriter()来向客户端发送字符数据时,如果在之前没有设置编码,那么默认使用iso,因为iso不支持中文,一定乱码
* 在使用response.getWriter()之前可以使用response.setCharaceterEncoding()来设置字符流的编码为gbk或utf-8,当然我们通常会选择utf-8。这样使用response.getWriter()发送的字符就是使用utf-8编码的。但还是会出现乱码!因为浏览器并不知道服务器发送过来的是什么编码的数据!这时浏览器会使用gbk来解码,所以乱码!
* 在使用response.getWriter()之前可以使用response.setHeader("Content-type","text/html;charset=utf-8")来设置响应头,通知浏览器服务器这边使用的是utf-8编码,而且在调用setHeader()后,还会自动执行setCharacterEncding()方法。这样浏览器会使用utf-8解码,所以就不会乱码了!
* setHeader("Content-Type", "text/html;charset=utf-8")的快捷方法是:setContentType("text/html;charset=utf-8)。
2. 请求编码
* 客户端发送给服务器的请求参数是什么编码:
客户端首先要打开一个页面,然后在页面中提交表单或点击超链接!在请求这个页面时,服务器响应的编码是什么,那么客户端发送请求时的编码就是什么。
* 服务器端默认使用什么编码来解码参数:
服务器端默认使用ISO-8859-1来解码!所以这一定会出现乱码的!因为iso不支持中文!
* 请求编码处理分为两种:GET和POST:GET请求参数不在请求体中,而POST请求参数在请求体中,所以它们的处理方式是不同的!
* GET请求编码处理:
> String username = new String(request.getParameter("iso-8859-1"), "utf-8");
> 在server.xml中配置URIEncoding=utf-8
* POST请求编码处理:
> String username = new String(request.getParameter("iso-8859-1"), "utf-8");
> 在获取参数之前调用request.setCharacterEncoding("utf-8");
代码:
public class Bservlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
*1.先获取iso的错误编码
*然后在重编
*/
String name=request.getParameter("user");
byte[] b = name.getBytes("iso-8859-1");
name=new String(b,"utf-8");
System.out.println(name);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1在获取参数之前调用request.setCharacterEncoding("utf-8");
*2.用request.getParameter();获取参数
* */
request.setCharacterEncoding("utf-8");
String name=request.getParameter("user");
System.out.println(name);
} }
3. URL编码
表单的类型:Content-Type: application/x-www-form-urlencoded,就是把中文转换成%后面跟随两位的16进制。
为什么要用它:在客户端和服务器之间传递中文时需要把它转换成网络适合的方式。
* 它不是字符编码!
* 它是用来在客户端与服务器之间传递参数用的一种方式!
* URL编码需要先指定一种字符编码,把字符串解码后,得到byte[],然后把小于0的字节+256,再转换成16进制。前面再添加一个%。
* POST请求默认就使用URL编码!tomcat会自动使用URL解码!
* URL编码:String username = URLEncoder.encode(username, "utf-8");
* URL解码:String username = URLDecoder.decode(username, "utf-8");
最后我们需要把链接中的中文参数,使用url来编码!今天不行,因为html中不能给出java代码,但后面学了jsp就可以了。
------------------
路径
* web.xml中<url-pattern>路径,(叫它Servlet路径!)
> 要么以“*”开关,要么为“/”开头
* 转发和包含路径
> *****以“/”开头:相对当前项目路径,例如:http://localhost:8080/项目名/request.getRequestdispacher("/BServlet").for...();
> 不以“/”开头:相对当前Servlet路径。 request.getRequestdispacher("/BServlet").for...();,假如当前Servlet是:http://localhost:8080/项目名/servlet/AServlet, 就是http://localhost:8080/项目名/servlet/BServlet
* 重定向路径(客户端路径)
> 以“/”开头:相对当前主机,例如:http://localhost:8080/, 所以需要自己手动添加项目名,例如;response.sendRedirect("/day10_1/Bservlet");
* 页面中超链接和表单路径
> 与重定向相同,都是客户端路径!需要添加项目名
- <form action="/day10_1/AServlet">
- <a href="/day10_/AServlet">
- <a href="AServlet">,如果不以“/”开头,那么相对当前页面所在路径。如果是http://localhost:8080/day10_1/html/form.html。 即:http://localhost:8080/day10_1/html/ASevlet
> *****建立使用以“/”开头的路径,即绝对路径!
* ServletContext获取资源路径
> 相对当前项目目录,即当然index.jsp所在目录
* ClassLoader获取资源路径
> 相对classes目录
* Class获取资源路径
> 以“/”开头相对classes目录
> 不以“/”开头相对当前.class文件所在目录。
代码:
/**
* 演示ClassLoader和Class获取类路径资源
* @author cxf
*
*/
public class Demo2 {
/*
* 说ClassLoader获取资源时,不能以“/”开头!
*/
@Test
public void fun1() throws IOException {
ClassLoader cl = Demo2.class.getClassLoader();//得到类加载器
InputStream in = cl.getResourceAsStream("a.html");//让类加载器去类路径下查找资源
System.out.println(IOUtils.toString(in));
} /*
* 使用class来加载类路径下的资源1
*/
@Test
public void fun2() throws IOException {
Class c = Demo2.class;
InputStream in = c.getResourceAsStream("/a.html");//与类加载器的效果相同
System.out.println(IOUtils.toString(in));
} /*
* 使用class来加载类路径下的资源2
*/
@Test
public void fun3() throws IOException {
Class c = Demo2.class;
InputStream in = c.getResourceAsStream("a.html");//到当前Class对应的.class文件所在目录去加载
System.out.println(IOUtils.toString(in));
}
}
web与request的更多相关文章
- org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported
1:先上控制台报错信息 org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not ...
- Web service request SetParameters to Report Server http://host/reportserver failed. Error: 请求因 HTTP 状态 401 失败: Unauthorized
迁移CRM服务器完成后在访问CRM的内部报表时报错,在查看应用服务器的日志时发现报"Web service request SetParameters to Report Server ht ...
- org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported解决!
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported解决 ...
- 【Feign调用异常】org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported
一.异常场景描述 明明是post请求,为啥到达服务器后就变成了get请求 2019-05-30 18:07:17.055 [http-nio-10650-exec-4] ERROR c.x.xcaut ...
- C# how to properly make a http web GET request
C# how to properly make a http web GET request EDIT 23/11/17 Updated to throw out examples using asy ...
- java web(四):request、response一些用法和文件的上传和下载
上一篇讲了ServletContent.ServletCOnfig.HTTPSession.request.response几个对象的生命周期.作用范围和一些用法.今天通过一个小项目运用这些知识.简单 ...
- Struts2中获取Web元素request、session、application对象的四种方式
我们在学习web编程的时候,一般都是通过requet.session.application(servletcontext)进行一系列相关的操作,request.session.和applicatio ...
- struts2获取web元素(request、session、application)
一.Action中获取 第一种方式: 通过ActionContext,这种方式取到的对象是Map类型 import java.util.Map; import com.opensymphony.xwo ...
- web基础---->request的请求参数分析
当contentType为application/json的时候,在servlet中通过request.getParameter得到的数据为空.今天我们就java的请求,分析一下request得到参数 ...
随机推荐
- bugly集成了Tinker热更新
介绍 热更新能力是Bugly为解决开发者紧急修复线上bug,而无需重新发版让用户无感知就能把问题修复的一项能力.Bugly目前采用微信Tinker的开源方案,开发者只需要集成我们提供的SDK就可以实现 ...
- 简洁、轻量的前端UI框架 - Hbook
Simple, lightweight front-end UI framework Get Start : http://www.bookcss.com Introduce Hbook focus ...
- php连接 mysql 数据库
php 连接数据库 一般是用面向对象的方法,需要先创建一个对象,即造一个连接对象,然后再写sql语句,(增改查删),最后执行sql语句 其中在创建连接对象时 我们用到的是MySQLI 是不区分大小写 ...
- C语言陷阱:浮点运算
在Stack overflow上看到这样一个问题. 计算如下表达式的值: P=(1/2-3/4)*(5/6-7/8)*…*[n/(n-1) - (n+2)/(n+3)]. 程序如下: #include ...
- web开发之Servlet 一
因为最近在研究公司一套新的框架,发现这套框架的底层是对Struts2,Spring 封装后的WEB应用框架,而我发现如果仅仅是利用这个框架开发,确实很容易快速上手,做业务来说是没有问题的,但我觉得如果 ...
- gridcontrol显示行号,总行,打印,导出Excel,设置标头及内容居中方法
1.一般为了表格显示数据更直观,经常会显示行号以及总数.让gridcontrol显示行号,首先你需要设置一下显示行号的宽度,也就是IndicatorWith.默认值为-1,可根据实际数值需要设置宽度, ...
- Oracle 生成一张测试表并插入随机数据
--生成随机表 --CREATE table scott.One_Million as ( SELECT ROWNUM AS T_ID, TRUNC(DBMS_RANDOM.VALUE(, )) 年龄 ...
- [Hadoop] - Hadoop3.0.x编译
这里仅介绍一种Hadoop3.0.x版本的源码编译方式 编译过程 1. 下载源码 2. 安装依赖环境 3. 源码编译 ========================================= ...
- 利用nginx concat模块合并js css
前言: nginx-http-concat模块是由淘宝网开发的,现在淘宝网合并js和css正是用这个模块,如链接http://a.tbcdn.cn/??s/kissy/1.2.0/kissy-min. ...
- KEEP!
[list][*]别问我前端有没有前途,我不知道,我只知道我现在喜欢前端,以后也应该喜欢.[*]别问我前端的工作好不好找,不管哪一职位,工作好不好找都是看你的水平.[*]别问我前端累不累,这世界就没有 ...