web入门
1.web服务软件作用:把本地资源共享给外部访问
2.tomcat服务器基本操作:
启动:%tomcat%bin/startup.bat
关闭:%tomcat%bin/shutdown.bat
访问tomcat主页:
http://localhost:8080
3.web应用目录结构
--------|WebRoot 根目录
----|静态资源(html+css+javascript+images+xml) 可以直接被浏览器访问到
-----------|动态资源 不可以被浏览器直接访问到
----------------|-classes 存放class的字节码文件
----------------|lib 存放jar包文件
----------------|web.xml web应用的配置文件,配置servlet
4.servlet技术:用java语言开发动态资源的技术
开发一个servlet程序的步骤:
1.创建一个java类,继承HttpServlet
2.重写HttpServlet类的doGet方法
3.把写好的servlet程序交给tomcat服务器运行
3.1把编译好的servlet的class文件拷贝到tomcat的一个web应用中。(web应用的WEB-INF/classes目录下)
3.2在当前web应用的web.xml文件中配置servlet
1 <!--servlet配置--> 2 <servlet> 3 <servlet-name>HelloWorld</servlet-name> 4 <servlet-class>类的全名</servlet-class> 5 </servlet> 6 <!-- servlet映射配置 --> 7 <servlet-mapping> 8 <servlet-name>HelloWorld</servlet-name> 9 <url-pattern>/hello</url-pattern> 10 </servlet-mapping>
4.访问servlet
http://localhost:8080/Project_name/hello
HTTP协议 浏览器和服务器之间传递的什么信息,怎么传的,要搞明白
1.什么是http协议?
http协议:对浏览器客户端和服务器客户端之间数据传输的格式的规范
开发者:用代码获得请求信息
全部的请求信息封装在HttpServletRequest对象中 服务器帮我们封装好了这个对象
浏览器直接访问资源,默认为Get方式
2.查看http协议的工具
1.使用火狐的firebug插件
2.使用谷歌的审查元素
3.使用系统自带的telnet工具
http协议内容:
Responses Headers 响应
Request Headers 请求 (一个完整的请求包括四个部分)
{此处为请求行}GET/day/helloHTTP/1.1
请求头:多个key-value对象
一个空行
name=eric&password=123456 实体内容(可选)
3.1请求行
GET/day09/hello HTTP/1.1 (由右向左看)
#http协议版本
http1.0:当前浏览器客户端与服务器客户端建立连接之后,只能发送一次请求,一次请求之后,链接关闭
http1.1 :当前浏览器客户端与服务器客户端建立连接之后,可以在一次链接之中发送多次请求(基本上都是用1.1,效率高)
问题:一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器的这个页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求?
答案:4次请求
在页面中找另外一个资源,则发出一个请求(一次请求会占用一个资源)
若是3张一样的图片,依然是发四次请求,只不过后面两次,浏览器将请求进行了拦截,将第一次加载的图片资源反还给后面的请求(利用浏览器的缓存来提高页面的加载效率)
#请求资源
URL:统一的资源定位符 http://localhost:8080/noe/index.jsp 只能定位互联网的资源 是uri的子集
URI:统一的资源标记符 /noe/index 用于标记任何资源。可以是本地文件系统,局域网的资源,可以是互联网。
#请求的方式
常见的请求方式:GET POST HEAD TRACE PUT CONNECT DELETE
常用的请求方式: GET POST
表单提交:
<form action="提交地址" method="GET/POST">
</form>
GET VS POST
1.GET方式提交
1.地址栏(URI)会跟上表单的参数数据,即在后台解析数据的时候会看到uri后边带着参数和数据
2.GET提交数据的参数数据有限制,不超过1kb
3.GET方式不适合提交敏感的数据,如密码
2.POST方式提交
1.参数不会跟在URI后面 (跟在请求的实体内容里面) 但是参数和数据在请求行的后面即在实体内容的位置 没有?开头,多个参数之间是以&分割
2.post提交的参数数据没有限制
3.POST方式提交敏感数据
3.2请求头
3.3 实体内容
只有POST提交的参数会放到实体内容中
3.4 HttpServletRequest对象
作用:用于获取请求的数据
核心的API:
请求行:
request.getMethod() 提交方式
request.getRequestURI() /request.getRequestURL()
request.getProtocol() 请求http协议版本
请求头:
request.getHeader("名称") 根据请求头获取请求值
request.getHeaderNames() 获取所有的请求头名称
实体内容:
request.getInputStream() 获取实体内容数据
3.5传递的请求参数如何获取
GET方式:参数放在URI后面
POST方式:参数放在实体内容中
获取GET方式参数:
request.getQueryString();
获取POST方式参数:
request.getInputStream();
问题是:以上两种方式不通用,而且获取到的参数还需要进一步的解析
所以可以使用统一方便的获取方式:
request.getParameter("参数名");根据参数名获取参数值(但是注意,这种方法只能获取一个值的参数)
request.getParameterValue("参数名");根据参数名获取参数值(可以获取多个值的参数)
request.getParameterNames();获取所有参数名称列表
在获得页面的参数的时候,如果页面传过来中文,页面一般使用UTF-8进行编码,而服务器这边使用的是ISO-8859-1编码,所以会出现乱码
手动重新解码:
1.name 字节 utf-8
2.name = request.getParameter(xxx) 字符iso-8859-1
3.name=new String (name.getBytes("iso-8859-1"),"utf-8")
编码 解码
由字符变为字节:编码 由字节变为字符:解码
全局设置编码:
在调用request.getParameter()方法之前,设置查询的码表:
request.setCharacterEncoding("UTF-8");
4.Http响应:
HTTP/1.1 200 OK 响应行
server:Apache-Coyote/1.1 响应头(key-value)
Content-length:24
Date:Fir,30 Jan 2015 01:54:57 GMT
一个空行
实体内容
4.1响应行
#http 协议版本
#状态码:服务器处理请求的结果(状态)
100~199 表示成功接受请求,要求客户端继续提交下一次请求才能完成整个处理过程
200~299 表示成功接受请求并已完成整个处理过程,常用200
300~399 为完成请求,客户端需进一步细化请求。例如,请求的资源已移动一个新地址,常用302、307、和304
400~499 客户端的请求有错误,常用404
500~599 服务器端出现错误,常用500
常见状态:
200:表示请求处理完成并完美返回
302:表示请求需要进一步细化
404:表示客户访问的资源找不到
500:表示服务器的资源发送错误(服务器内部错误)
#状态描述
4.2常见的响应头
Location:http://www.it315.org/index.jsp 表示重定向的地址,该头和302的状态码一起使用 Server:apache tomcat 表示服务器类型 Content-Encoding:gzip 表示服务器发送给浏览器的数据压缩类型 Content-Length:80 表示服务器发送给浏览器的数据长度 Content-Language:zh-cn 表示服务器支持的语言 Content-Type:text/html;charset=GB2312 表示服务器发送给浏览器的数据类型及数据编码 Last-Modified:Tue,11 Jul 2000 18:23:51 GMT 表示服务器资源最后修改时间 Refresh:1;url=http://www.it315.org 表示一个定时的刷新 Content-Disposition:attachment;filename=aaa.zip 表示告诉浏览器以下载的方式打开资源(下载文件时用 Transfer-Enconding:chunked Set-Cookie:SS=Q0=5Lb_nQ;path=/search 表示服务器发送给浏览器的cookie(会话管理的时候会用到) Expires:-1 表示通知浏览器不进行缓存 Cache-Control:no-cache Pragma:no-cache Connection:close/Keep-Alive 表示服务器和浏览器链接的状态 |
对于开发者来说,需要设置响应的信息
4.3httpServletResponse
httpServletResponse对象修改响应的信息:
响应的行:
response.setStatus() 设置响应的状态码
响应头:
response.setHeader(name,value); 设置响应头
请求重定向一共向服务器发了两次请求
1 package com.http.response; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 /** 10 * 请求重定向 11 * (相当于超链接跳转页面) 12 * Servlet implementation class response_location 13 */ 14 public class response_location extends HttpServlet { 15 private static final long serialVersionUID = 1L; 16 17 /** 18 * @see HttpServlet#HttpServlet() 19 */ 20 public response_location() { 21 super(); 22 // TODO Auto-generated constructor stub 23 } 24 25 /** 26 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 27 */ 28 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 29 30 /** 31 * 需求:跳转到adv.html 32 * 使用请求重定向:发送一个302状态码+location的响应头 33 * 浏览器认识302状态码,当浏览器得到302码之后,会再次向服务器发出一个请求, 34 * 请求的地址就是location的value的值 35 * 36 */ 37 38 response.setStatus(302); 39 response.setHeader("location", "/Http/adv.html"); 40 response.sendRedirect("/Http/adv.html"); 41 42 // response.getWriter().append("Served at: ").append(request.getContextPath()); 43 } 44 45 /** 46 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 47 */ 48 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 49 50 doGet(request, response); 51 } 52 53 }
实体内容:
response.getWrite().write("content"); 发送字符实体内容
response.getOutputStream.writer(); 发送字节实体内容
4.4案例:重定向
定时刷新(refresh):response.setHeader("refresh", "1");
原理:浏览器认识refresh头,得到refresh头重新请求
隔n秒后跳转到其他页面:response.setHeader("refresh","3;url=http://localhost:8080/Http/adv.html");
contentType作用:告诉浏览器要发送的内容类型
1 package com.http.response; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 /** 12 * Servlet implementation class response_contentType 13 */ 14 public class response_contentType extends HttpServlet { 15 private static final long serialVersionUID = 1L; 16 17 /** 18 * @see HttpServlet#HttpServlet() 19 */ 20 public response_contentType() { 21 super(); 22 // TODO Auto-generated constructor stub 23 } 24 25 /** 26 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 27 */ 28 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 29 // response.setHeader("content-type", "text/html"); 30 // response.setContentType("text/html;charset=utf-8"); 31 // response.getWriter().write("<html><title></title><body><h1>html</h1></body></html>"); 32 // response.sendRedirect("/Http/adv.html"); 33 34 35 File file = new File("E:\pic.jpg"); 36 37 // Content-Disposition:attachment;filename=aaa.zip 38 //在照片传上去之前,告诉浏览器以下载方式打开资源 39 response.setHeader("Content-Disposition", "attachment;filename="+file.getName()); 40 41 response.setContentType("image/jpg"); 42 FileInputStream in = new FileInputStream(file); 43 44 byte[]b= new byte[1024]; 45 int length = 0; 46 while((length=in.read(b))!=-1){ 47 response.getOutputStream().write(b,0,length); 48 } 49 50 51 } 52 53 /** 54 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 55 */ 56 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 57 58 doGet(request, response); 59 } 60 61 }
关于乱码问题:
在服务器向浏览器输送数据的时候,会发生乱码问题
默认为iso-8859-1
在response.getWriter.writer();方法前使用response.setCharceterEncoding("utf-8");
设置响应的实体内容的编码
完美项目解决编码问题:
在每个servlet开头写:
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8")
总结:
http协议:浏览器和服务器之间数据传输的格式规范
1.http:请求
格式:
请求行
请求头
空行
实体内容(POST提交的对象在实体内容中)
重点:
使用HttpServletRequest对象:获取请求的数据
2.http响应
格式:
响应行
响应头
空行
实体内容(浏览器看到的内容)
重点:
使用httpServletResponse对象:设置响应数据