本帖最后由 小石姐姐 于 2018-6-7 10:24 编辑
就业班_JavaEE_day13_14_15_Servlet
一 软件架构、Tomcat、Http协议
1 软件架构 bs cs
2 静态资源(html css js image)和动态资源(jsp servlet) 动态资源先转换为静态资源再发给客户端。
web项目的目录结构:
2.5规范
WEBROOT
|-----WEB-INF
|---web.xml 必须
|---classes 不是必须
|---lib 不是必须
3.0规范 web.xml 也不是必须的 改用注解
3 tomcat服务器 需要配置java_home环境变量,不配置,可以通过在startup.bat中添加pause查看报错原因。
A 目录结构
bin conf webapps work log
B server.xml 配置文件
1个server
1个service
多个connnector
一个Engine
多个host
多个conext
C tomcat配置外部应用的二种方式
1 在server.xml中配置context
<context path="" docBase=""/> path配置的是项目的访问名称,docBase配置的外部项目的文件目录。
2 在conf/catalina/localhost 下配置app.xml 一般用这种。
<context docBase=""/> path 不用再配置,xml的文件名即是项目名称
D tomcat配置内部应用
将项目文件夹放在webapps目录内,或者 将一个项目的WAR包放在webapps目录内,tomcat启动会自动解压。
4 http协议 基于请求和响应模式
http1.0 和 http1.1 最主要区别 长连接 一次连接中可以请求和响应多次。
请求格式 响应格式:
请求行 响应行
请求头 响应头
空格 空格
请求体 响应体
常见请求头
use-agent 浏览器和操作系统相关信息
referer 防止盗链 从什么页面请求过来
If-Modified-Since 客户端本地该文件的记录的时间。
Content-Type: application/x-www-form-urlencoded 表示form表单中的中文参数值会自动使用url来编码!
常见响应头
location 重定向的跳转地址 302
last_modified 文件的最近修改时间 与If-Modified-Since请求头结合使用
Refresh: 3;url=http://www.itcast.cn 定时跳转
Content-dispositon 文件下载时使用,弹框提示。response.setHeader("Content-Disposition", "attachment;filename="+filename);
常见状态码 200 成功 302 重定向 304服务器端没变,从本地缓存查找 404 找不到页面 500 服务器内部错误
二 Servlet
1概述 sun 规范 服务器端 动态网页 主要用来处理http请求和响应
注意:servlet 是单例和线程不安全的。
2 创建servlet
创建的三种方式:
A 实现Servlet接口
3个生命周期方法 init service destory
servletconfig 接口
对应servlet的配置文件 <init-param>
getServletName(); getInitparameter() getInitParameterNames() getServletContext();
ServletContext 对应一个web应用。
1 可以作为一个域对象,生命周期最长 ,
2 对应web.xml中的整个应用的初始化参数 <context-param>
3 可以通过getrealpath获取文件的磁盘绝对路径 相对于web项目的根目录
getResourceAsStream 以IO流的方式获取 相对于web项目的根目录
4 获取文件的MIME类型 getMimeType(String 文件名) 根据文件后缀可以获取到对应的MIME类型。
路径扩展:
在web项目中,相对路径和绝对路径都可以,但推荐全部使用绝对路径。同时要区分服务器端路径和客户端路径。
客户端路径需要加上项目名称,服务器端不需要加上项目名称。
ServletContext的getrealpath和getResourceAsStream方法中的路径 / 表示的web项目的根路径。
Classloader获取资源getResourceAsStream中 / 表示的是web-inf下的classes目录
通过class获取资源getResourceAsStream中 / 表示的也是web-inf下的classes目录
客户端页面中的form中的Action 和a 中href的 / 表示web项目的根路径。
在普通java项目中,File的路径分二种,一种是指定盘符下的比如c:\readme.txt 这种文件就直接创建使用new File("c:\readme.txt"),
另外一种是要读取项目中的某个文件,则用相对路径,相对于java项目的根路径。
B GenericServlet抽象类 implment ServerConfig 和 servlet 二个接口
注意有二个init方法 不带参数的init是一个空实现,子类可以重写。
C 继承HttpServlet类 该类继承genericservlet
有二个service方法 , 对request和response进行强转后 调用自己的service方法,在自己的service方法中根据请求方式不同 调用doget和dopost方法。
我们只需要重写doget和dopost即可。
3 web.xml配置文件
<web-app>
<context-param>
<param-name></param-name>
<param-value></param-value>
</context-param>
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>类的全名</servlet-class>
<init-param>
<param-name>aaa</param-name>
<param-value>bbb</param-value>
</init-param>
<load-on-startup>非负整数</load-on-startup> 表示服务器启动的时候就创建servlet 默认servlet是浏览器请求才会创建。建议从2开始。
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>路径1</url-pattern>
<url-pattern>路径2</url-pattern>
</servlet-mapping>
</web-app>
其中servlet的urlpattern有三种方式配置
精确配置(/AServlet) -- 最长目录配置(/aaa/bbb/*) -- 后缀名配置(*.action) 优先级依次降低
* 通配符不要写在中间。
三 response和request
request和reponse都是服务器帮我们封装好了。我们直接使用即可。
response能干什么:
1 设置响应码
setStatus() 可以用来设置302 200 正确状态码
sendError() 用来设置错误状态码 比如404 500
2 可以设置响应头 一个头名可能对应多个头值 , 相当于MAP
setHeader(key,value) setIntHeader setDateHeader 设置单值
addhearder 用来设置多值
3 可以设置响应体
response.getWriter()
reponse.getOutputStream 获取输出字节字符流 用来实现文件的下载,文件下载中的文件名称需要针对不同浏览器做不同的处理
response.setHeader("Content-Disposition", "attachment;filename="+filename);
4 重定向
response.sendRedirect()
request能干什么
1.获取客户端ip request.getRemoteAddr();
2 获取请求头
getHeader(k) 获取单值
getHeaders 获取多值
3 获取URL 例如 http://localhost:8080/helloworld/Aservlet?username='zhangshan'
getRequestURL : http://localhost:8080/helloworld/Aservlet
getRequestURI (又叫做请求URI) :/helloworld/Aservlet
getQueryString :username='zhangshan'
getSchame : http
getHost : localhost
getPort : 8080
getContextPath : /helloworld
getServletPath : /Aservlet
4 获取请求参数 即3中的QueryString
String getParameter( String name ) 获取单值
String[] getParameterValues(String name) 获取多值
Map<string,String[]> getParameterMap()
Enumeration getParamterNames()
5 作为域对象,在多个servlet之间传递数据
setAtrribute(string,object)
getAtrribute(string)
removeAttribute(string)
5 请求转发和包含
request.getRequestDispatcher().forword() request.getRequestDispatcher().include();
转发和包含的区别:
1 转发, 前者servlet 留头不留体 不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由后面的Servlet来完成。
但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);
2 包含 , 前者servlet 留头也可以留体。
重定向与请求转发的区别:
1. 地址栏是否改变
2 重定向二次请求和响应 转发一次请求和响应
3 重定向可以转到外部应用 转发只能在内部应用之间跳转
四 乱码
响应编码:
字符流响应中文
1.设置字符流缓冲区编码为UTF8 ,默认是ISO-8859-1。
2 设置响应头contenttype 告诉浏览器用什么编码解析。response.setHeader("Content-Type","text/html;charset=utf-8");
这二个步骤可以通过response.setContentType("text/html;charset=utf-8") 这一句解决。
字节流响应中文, 一般用来做文件下载。
1.“中文“.getBytes("utf-8")。将中文以指定编码转化为字节数组。
2 设置响应头contenttype 告诉浏览器用什么编码解析。response.setHeader("Content-Type","text/html;charset=utf-8");
请求编码:
1 通过表单提交(post)或者超链接(get) 请求的编码与上一次响应的编码一致(即页面自身的编码),大部分应该是utf8
2
针对post方式,在获取请求参数之前 通过request.setCharacterEncoding("utf-8") 可以解决。不让tomcat用默认解码方式。
针对get方式, 通过获取到参数值之后,对参数值进行反编码操作到utf8格式。new String(request.getParameter(key).getBytes('ISO-8859-1'),'UTF-8')
URI编码
URI编码不是字符编码,是一种用于客户端和服务器端传递参数的一种方式,URI编码是在字符编码的基础上进行了一种转换。
post请求体中的参数默认浏览器会进行URI编码。而get请求中的中文参数需要我们人为去进行URI编码。例如超链接中的<a href="/zxx/xx?username='张三'">
服务器端会自动对传递过来的编码进行URI解码。
|