JSP
0 前言
这是我的一个jsp学习笔记,用于复习和总结,记录总结有误的请多多指教,万分感谢.
日更
最后一次更新时间:20/12/2
1统一字符集编码
** a.设置jsp文件的编码**
因为jsp会被翻译成Java文件, 所以需要编码 (jsp----->Java)通过jsp文件中的 page pageEncoing属性来设置 ;
pageEncoding="UTF-8
Tomcat8.5以上默认的编码是 UTF-8
b.设置浏览器读取jsp文件的编码
浏览器读取jsp文件需要程序员手动为他选着一个编码规范来读取
<meta charset="UTF-8" content="text/html; charset=UTF-8">
c.文本编码:
统一设置
1-2 乱码
-
产生乱码的原因:
-
1)编码方案不同**
-
2)读取方式不同
-
3)一定要区分get和post两种提交方式
1-2-1 get与post区分
get:信息可见,容量有限4-5KB
method="get"//地址栏,超链接都默认属于get提交方式
post:信息隐藏 , 文件上传必须用post
method="post
1-3 统一请求的编码
必须先区分get和post
1-3-1 get请求:
a.单个变量乱码 : new String(“旧编码”,“新编码”);
name = new String(name.getBytes("iso-8859-1"),"utf-8");//强转码
b.修改Tomcat默认的get提交方式的编码方案: sever.xml 第65行代码 添加 URIEnding=“UTF-8”
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8888" protocol="HTTP/1.1" redirectPort="8443" URIEnding="UTF-8"/>
1-3-2 post请求:
代码块上面添加一行代码
request.setCharacterEncoding("utf-8");
2JSP页面元素
a.脚本
<%
局部变量,Java语句
%>
<%!
全局变量,或者定义方法
%>
<%=输出%> //可以直接解析代码
代码演示
<%!
public String Name;//全局变量
public void test(String name){
Name=name;
}
%>
<%
String name = "刘佳奇";
out.print(name);
test("雨洁(~.~)");
%>
<%=Name %>
一般而言修改Jsp/heml/js,不需要重启
println(),不能回车,需要加标签
b.指令
JSP指令用来设置整个JSP页面相关的属性
指令 | 描述 |
---|---|
<%@ page … %> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义 |
c.注释
<!-- html注释,可被看到 -->
//Java单行注释
/*java多行注释*/
<%-- jsp注释 --%>
2-2Page指令
Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
Page指令的语法格式:
<%@ page attribute="value" %>
等价的XML格式:
<jsp:directive.page attribute="value" />
属性
下表列出与Page指令相关的属性:
属性 | 描述 |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
2-3 Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
等价的XML语法:
<jsp:directive.include file="文件相对 url 地址" />
2-4Taglib指令
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
等价的XML语法:
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
3 九大内置对象
不需要new可直接使用
3-1 request请求对象
request, 储存客服端向服务端发出的请求信息
request 对象是 javax.servlet.httpServletRequest 类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
3-1-1 Request常用的方法:
1.00 getParameter(String strTagtName) 获取表单提交的信息。
String strName=request.getParameter("name");
1.01 getParameteerValues(String strTagName), 获取表单提交的多个值,(返回checkbox的value)
String[] hobbies= request.getParameterValues("uhobbies");
1.02 request.setCharacterEncoding(“utf-8”); 设置post里数据的请求编码
request.setCharacterEncoding("utf-8");
以上必记
1.03 getProtocol() 获取客户使用的协议。
String strProtocol=request.getProtocol();
1.04 getServletPath() 获取客户提交信息的页面。
String strServlet=request.getServletPath();
1.05 getMethod() 获取客户提交信息的方式,get|post。
String strMethod = request.getMethod();
1.06 getHeade() 获取HTTP头文件中的accept、accept-encoding和Host的值。
String strHeader = request.getHeader("accept");
1.76 getRermoteAddr() 获取客户的IP地址。
String strIP = request.getRemoteAddr();
1.08 getRemoteHost() 获取客户机的名称。
String clientName = request.getRemoteHost();
1.09 getServerName() 获取服务器名称。
String serverName = request.getServerName();
1.10 getServerPort() 获取服务器的端口号。
int serverPort = request.getServerPort();
1.11 getParameterNames() 获取客户端提交的所有参数的名字。
Enumeration enum = request.getParameterNames();while(enum.hasMoreElements()){ String s=(String)enum.nextElement(); out.println(s);}
1.12 getHeaderNames() 取出全部头信息。
<%
Enumeration enu = request.getHeaderNames();//取出全部头信息
while(enu.hasMoreElements()){
String name = (String)enu.nextElement();
String value = request.getHeader(name);
%>
<h1><%=name %>--<%=value %></h1>
<%
}
%>
3-2 response响应对象
response储存服务器对客户端的响应信息以及处理http的连接信息,
例如设置http文件头,设置cookie对象等。
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
3-2-1 response常用方法:
2.01 void addCookie(Cookie cookie); 服务器向客户端增加cookie对象
response.addCookie(userCookie);//此方法要和Cookie对象配合使用
2.02 void sendRedirect(String location) throws IOException; 页面跳转的一种方法(送到更改的地址-send:送–Redirect:使改寄)
response.sendRedirect("name.jsp");
2.03 setCharacterEncoding(“编码”)
request.setCharacterEncoding("UTF-8");
以上特重要必记
3-2-2 转发重定向
转发
request.getRequestDispatcher("跳转页面 ").dorward(requst.reponse);
request.getRequestDispatcher("succes.jsp").forward(request,response);
-
特点:
-
- 可以跳转页面,但是浏览器的地址栏不变,服务体帮你显示跳转页面的结果
-
- 保留第一次请求时的数据
-
- 浏览器只做了一次请求,服务器找到那个页面,然后响应给你\
-
- 服务器内部跳转
重定向
response…sendRedirect(“重定向页面”);
response.sendRedirect("succes.jsp");
-
特点:
- 可以跳转页面,但是浏览器的地址变了,所以两次请求,两次响应,故请求时的是数据不保留 浏览器请求跳转:
- 第一次请求–>浏览器向服务器请求跳转,
- 第一次响应–>服务器同意,且通过response发给浏览器跳转的地址
- 第二次浏览器请求跳转服务器给出的地址
- 第二次响应:服务器给出响应
3-3 Session 会话对象
-
案例:
- a.浏览网页:开始–>关闭就是一次会话
-
b.购物: 浏览–>付款–>退出就是一次对话
c. 电子邮件: 浏览–>写信–>发送–>退出就是一次对话
**总结:**一次会话就是从开始到结束.
3-3-1 Cookie
Cookie(服务器端,不是内置对象) : Cookie 是由服务器产生的 , 再发给客户端保存. 相当于本地缓存的作用 : 提高服务器访问效率,但是安全较差 . 有时间限制
Cookie.servlet.http.Cookie 产生的
public Cookie(String name, String value)
Cookie name = value
必记方法:
String getName(); 获得name
String getValue(); 获得value
void setMaxAge()int expiry); 最大有效时间
服务器
- 服务器创建Cookie对象
Cookie cookie = new Cookie("name","value");
- 服务器添加Cookie:
response.addCookie(Cookie cookie);
- 设置Cookie存在时间
cookie.setMaxAget(10);//10秒
- 服务器传给客户端Cookie:
通过页面跳转 (转发或者重定向)
response.sendRedirect("name.jsp");
客户端
- 客户端获取本地所有Cookie对象的一个数组:
Cookie[] users = request.getCookies();
- 通过for循环找到需要的Cookie对象
for (Cookie key : users) {
if (key.getName().equals("name")) {
cname = key.getValue();
}
}
- 使用Cookie
key.getname();
key.getValue();
-
特别注意:
-
a.服务器增加cookie :通过response; 客户端获取对象: request 对象;
b. 目前没有提供获取某一个对象,只能一次性全部拿
c. 会自动生成一个
name:JSESSIONID
value:F62FFAD5C742DA5BCA30BE1EE8DCCE8C
的cookie;
d. Cookie是由服务端产生,最终保存在客户端的
总结:
- cookie就是客户端发个服务端数据,再由服务端创建,然后服务端发给客户端到本地保存的,最后由服务端访问本地文件来获取的一个对象
- 浏览器f12–>网络–>发现多了一个name为JSESSIONID的cookie.