本帖最后由 小石姐姐 于 2018-5-23 16:46 编辑
Request
获取浏览器发送过来的数据,组成部分:请求行、请求头、请求体
HttpServletRequest
//作为域对象存取数据
xxxAttribute() //三个方法set get remove
//请求转发
getRequestDispatcher("/servlet路径").forward(request,response)
//获取请求参数
String getParameter(String key) //获取一个值
String[] getParameterValues(String key) //通过一个key获取多个值
Map<String,String[]> getParameterMap() //获取所有的参数名称和值
Enumeration getParameterNames() //用于获取表单中提交的所有的参数的名称.
//获取客户机信息
String getMethod() //获取请求方式。
String getRemoteAddr() //获取IP地址
String getContextPath() //获取/项目名
String getRequestURI() //获取从/项目名到参数之前的内容
StringBuffer getRequestURL() //获取http到参数之前的内容
//获取请求头信息
String getHeader(String key) //通过key获取指定的value (一个)
Enumeration getHeaders(String name) //通过key获取指定的value(多个)
Enumeration getHeaderNames() //获取所有的请求头的名称
int getIntHeader(String key) //获取整型的请求头
long getDateHeader(String key) //获取时间的请求头
//获取Cookie
Cookie[] getCookies() //获取所有Cookie
//获取Session
HttpSession getSession() //根据浏览器携带的sessionid,有则返回原来的session,没有则新建一个session返回
接收参数的中文乱码问题:(tomcat7使用ISO8859-1)
1.GET
原因:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码
解决:new String("参数".getBytes("iso-8859-1"),"utf-8");
2.POST
原因:参数是放在请求体中,数据封装到Servlet中的request中,request也有一个缓冲区是ISO-8859-1编码
解决:request.setCharacterEncoding("utf-8");
常用响应头:
user-agent:浏览器内核 msie Firefox chrome
referer:页面从那里来 防盗链
Cookie: key=value //携带cookie到服务器
Response
响应,用于向浏览器写输出内容
组成部分:响应行、响应头、响应体
HttpServletResponse 接口。针对HTTP协议
//响应行操作
setStatus(int 状态码) //针对于1xx,2xx,3xx
sendError(int 状态码) //针对于4xx,5xx
//响应头操作
//追加响应头,针对多个value的响应头
addHeader(String key,String value)
addDateHeader(String name,long date)
addIntHeader(String name,int value)
//设置/覆盖响应头,针对一个value的响应头
setHeader(String key,String value)
setDateHeader(String name,long date)
setIntHeader(String name,int value)
//快捷设置
sendRedirect("/路径") //设置location值
addCookie(Cookie cookie) //向浏览器添加cookie
//响应体操作(两个流互斥,响应完成服务器会自动关闭流)
PrintWriter getWriter() //字符流,回写内容
ServletOutputStream getOutPutStream() //字节流
响应中文乱码问题:
字节流:
设置浏览器解码:resposne.setHeader("Content-Type","text/html;charset=UTF-8");
设置响应编码:"中文".getBytes("UTF-8")
字符流:
设置浏览器解码:resposne.setHeader("Content-Type","text/html;charset=UTF-8");
设置response缓冲区的编码:response.setCharacterEncoding("UTF-8");
简化写法:setContentType("text/html;charset=utf-8") //设置content-type值,且设置response缓冲区的编码
文件下载
1. 超链接下载。前提:浏览器不能解析的文件
<a href="资源路径"></a> //若浏览器能解析该资源则打开,否则下载
2. 编写代码下载
<a href="Servlet路径?filename=文件名">下载</a>
(1) 设置响应头
Content-Type: 文件的mime类型
content-disposition: "attachment;filename=文件名称"
(2) 提供流传输
OutputStream response.getOutPutStream()
InputSream new FileInputSream("服务器上文件路径")
注意:中文名称的文件名下载的时候名称会出现乱码
原因:
常见的浏览器使用URL编码格式解码
火狐使用base64解码
解决:
对于常见浏览器设置文件名URL编码:
对于火狐将文件名base64编码:
public static String getName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
常见状态码:
1xx 已发送请求
2xx 已完成响应
200 正常响应
3xx 还需浏览器进一步操作
302 重定向
304 读缓存
4xx 用户操作错误
404 用户操作错误
405 访问的方法不存在
5xx 服务器错误
500 内部异常
常见响应头:
location: "路径" //重定向
refresh: "3;url=页面路径" //定时刷新。如: 秒后跳转到指定页面
content-type: "text/html;charset=utf-8" //设置文件mime类型,设置响应流的编码及告诉浏览器使用什么编码打开
content-disposition:"attachment;filename=文件名称" //用于文件下载配置
Set-Cookie: key=value //保存cookie到浏览
重定向&转发的区别(redirect和forward区别)
- 地址栏:重定向地址栏发生改变,转发不变
- 请求响应次数:重定向两次请求两次响应,转发一次请求一次响应
- 路径:重定向是从浏览器发送,路径需要加项目名;转发是服务器内部之间跳转,路径可以不加项目名
- 跳转范围:重定向可以跳转到任意网站,转发只能在当前项目下跳转
Cookie
会话:用户打开一个浏览器访问页面,访问网站的多个页面,访问完成后将浏览器关闭的过程称为一次会话
作用:将用户数据私有化(如:购物信息)
原理:数据存在客户端。服务器将通过响应头(Set-Cookie: key=value)将cookie保存到浏览器端,当用户再次访问的时候会通过请求头(Cookie: key1=value2; key2=value2)携带cookie到服务器。
Cookie(String name,String value) //创建Cookie
getName() //获取键
getValue() //获取值
setDomain(String domain) //设置Cookie的有效域名
setPath(String path) //设置Cookie的有效路径
一般写工程名,用于删除持久化的Cookie。两个path相同,再设置存活时间为0即可。
setMaxAge(int 秒) //设置cookie在浏览器端的存活时间。默认关闭浏览器时删除cookie
0:删除该cookie(前提路径一致)
Cookie分类:
会话级别:默认Cookie,关闭浏览器Cookie就会销毁
持久级别:可以设置Cookie有效时间。
存储中文乱码问题:
存之前:将value编码:java.net.URLEncoder.encode("中文value","utf-8")
取之后:将value解码:URLEncoder.decode("中文value","utf-8")
Session
原理:依赖Cookie,数据存在服务器端。浏览器请求时,服务器调用request.getSession()获取session时,看浏览器cookie中是否携带JSESSIONID,没有则创建新session空间返回,并让将JSESSIONID写回浏览器cookie,有则根据SESSIONID找到对应的session空间返回。
HttpSession
//域对象
xxxAttribute()
//清除Session
invalidate()
JSP
概述
JSP(java server pages)java服务器端页面:本质是一个servlet,在HTML中嵌套java代码。运行在服务器端,处理请求,生成动态的内容。
jsp = html + java代码 + jsp自身
执行原理:
1. 请求JSP文件 -> jspServlet查找对应jsp文件
2. jsp文件 -> java文件 -> class文件。java文件和class文件存放在tomcat/work/...下。
3. 服务器运行class文件组成响应信息,发送到浏览器
JSP脚本
JSP嵌入Java代码/JSP脚本元素:
<%...%> java程序片段。内容生成到jsp的service()方法中。
<%=...%> 输出表达式。内容生成到jsp的service()方法中,相当于out.print(...)
<%!...%> 声明成员。(不建议)内容生成到类中成员位置。定义变量,方法,类。因为线程不安全,尽量少定义成员
JSP注释
什么样的代码用什么注释。快捷键:Ctrl+Shift+/
<%-- JSP注释 --%> //只存在于JSP源代码中,翻译成Servlet后消失
JSP指令
作用:声明JSP页面的属性和动作
格式:<% @指令名称 属性="值" %> //多个属性空格分隔
指令分类:一个页面可以出现多个指令,一般放在jsp页面最上面
page指令:声明jsp页面的属性
errorPage="内部路径" //当前jsp页面出现异常时要跳转的页面
也可在web.xml下项目配置全局错误页面
isErrorPage="false" //当前jsp页面是否是一个错误页面,如果true,可以使用(Throwable exception)内置对象操作异常信息
contentType="text/html; charset=UTF-8" //设置响应流的编码,通知浏览器用什么编码打开,设置文件的mime类型
pageEncoding="UTF-8" //设置文件保存到硬盘,以及生成Servlet的保存的编码
improt //导入需要的包,可以出现多次
language="java" //当前jsp页面里可以嵌套的语言
autoFlush="true" //设置JSP的缓存自动刷出
buffer="8kb" //设置JSP的缓冲区的大小
extends: //声明当前jsp页面继承于哪个类,必须继承的是httpservlet及其子类
session="true" //设置jsp页面是否可以使用session内置对象
isELIgnored="false" //是否忽略EL表达式
extends //设置JSP翻译成Servlet后继承的类,默认值:org.apache.jasper.runtime.HttpJspBase,这个值要想修改,这个类必须是HttpServlet及其子类
contentType和pageEncoding区别和联系
若都出现,各自使用各自的编码
若出现一者,两个都使用此编码
两者都不出现,使用浏览器默认编码,ISO8859-1
include指令:静态包含
静态包含,就是将其他页面或者servlet的内容包含进来,一起进行编译,生成一个java文件
file="内部路径"
taglib指令:指示JSP引入标签库
prefix="前缀名" //标签的别名
uri="名称空间" //标签的URI路径
导入之后
<前缀名:标签 .. >
JSP内置对象
对象类型 名称
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
page Object(this,JSP翻译成Servlet后的类的引用)
out JspWriter(原理:先将缓冲区中内容写入response的PrintWriter的缓冲区,再通过response响应到页面)
pageContext PageContext
config ServletConfig
exception Throwable(指令page设置:isErrorPage="true")
PageContext
//域对象
xxxAttribute()
//代替其他三个域存取数据
xxxAttribute(... , int scope)
PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE,APPLICATION_SCOPE
findAttribute(String key) //依次从pageContext,request,session,application查找并返回值,没有返回null
//获得其他的8个内置对象:编写通用性代码或者框架的时候
getXxx() //如: getRequest()获取request内置对象
动作标签
代替代码,简化书写。后台由于架构体系,使用不多。
//用于页面的转发.
<jsp:forward page="内部路径"></jsp:forward>
相当于:request.getRequestDispatcher(...).forward(...);
//动态包含
<jsp:include page="" />
//静态包含和动态包含的区别?(<%@ include%>和<jsp:include>)
静态包含:将被包含页面放入包含页面一起翻译成servlet,一起编译,一起执行
动态包含:被包含页面和包含页面分别翻译成servlet,分别编译,将被包含页面执行结果一起执行
<jsp:param /> //用于带有路径的标签下,传递参数.
<jsp:useBean /> //用于在JSP中使用JavaBean.
<jsp:setProperty /> //用于在JSP中向JavaBean设置属性的.
<jsp:getProperty /> //用于在JSP中获得JavaBean的属性.
EL表达式
概述: EL(Expression Language)简化JSP写法,用来替代<% ... %>(JSP2.0开始)
语法
格式:${EL表达式}
获取域中数据(从4个域中)
//获取普通单值数据
${xxxScope.域key } //pageScope,requestScope,sessionScope,applicationScope
${域key } //依次范围从小到大查找属性值,没有返回空字符串
//获取集合|数组数据
${域key[index]} //获取数组|Listindex对应的值
${域key.MapKey} //获取Map中key对应的值
//获取对象数据
${域key.bean属性} //获取对象中属性值
//[]和.区别:
[]用于有下标的数据(数组,list集合)
.用于有属性的数据(map,对象)
如果属性名中包含有特殊的字符.必须使用[""]
执行运算
//算数运算(+-*/)
+:只能加法运算,字符串形式数字可以进行加法运算
//逻辑运算
< lt //less than
> gt //great than
<= le //less equal
>= ge //great equal
== eq //equal
//关系运算
&& and
|| or
! not
//三元运算
a<b?...:...
//empty运算
empty 域中key //判断一个容器的长度是否为0|null,一个对象是否为null
not empty 域中key //不为
EL操作WEB开发的常用的对象(除了pageContext其余对象获取的都是map集合)
pageScope(专门获取域数据)、requestScope、sessionScope、applicationScope
param、paramValues //接收参数。values:对应多个值的参数,返回数组
header、headerValues //获取请求头信息
initParam //获取全局初始化参数(web.xml - <context-param>)
cookie //返回Map<String,Cookie>
.Cookie的key.value //获取值
pageContext //获取的不是Map集合,相当于JSP的pageContext
.request.属性名 //如:获取项目名:.contextPath
调用Java中方法
JSTL标签库
概述:JSTL(JSP Standard Tag Library)JSP标准标签库。Apache提供。JSTL1.1版本后支持EL表达式
作用:替代java脚本,替换页面中<%%>。常用于遍历,判断
语法
分类:
core:核心标签
fmt:格式化|国际化
xml:过时,XML标签
sql:过时,SQL标签
fn:JSTL提供EL函数库,很少使用
core
1.导入jar包(jstl.jar 和 standard.jar)
2.在页面上导入标签库
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if test="EL表达式条件">满足条件输出</c:if>
var="变量" scope="域" //将test结果存入域,不用。管理角度看:不利于项目发展
<c:forEach var="取出的项命名"></c:forEach>
items="待遍历对象" //相当于ForEach
begin="开始值" end="结束值" step="步进默认1"
varStatus="状态命名" //表示遍历状态
.count //遍历到第几个
.index //索引
<c:set var="变量名" value="值" scope="域"></c:set> //向域中存数据
域:page,
<c:out value="值|EL" ></a:out>
default="默认值" //没有时输出
escapeXML="false" //默认对输出内容转义
c:choose
c:when
c:otherwise
fn
1.在页面上导入标签库
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
MVC设计模式
动态网页开发模式。就是将业务逻辑,代码,显示相分离的一种思想。
M : Model 模型层
作用:封装数据,封装对数据的访问,JavaBean
V : View 视图层
作用:展示数据,JSP
C : Controller 控制层
作用:接收请求,找到相应JavaBean完成业务逻辑,Servlet
JavaBean+Servlet+JSP
原理:用户请求一个Servlet(Controller层),Servlet先调用一个JavaBean(Model层)封装数据,再调用另一个JavaBean处理数据(Service,Model层)。然后跳转到JSP页面(View层)显示数据。
|
|