JSP
一、JSP入门
1.JSP:动态网页
- 网页分为静态和动态
- 动态网页需要使用到服务端脚本语言(JSP)
- jsp就是在HTML中嵌套的java代码
2.tomcat解压后目录详解
- bin : 可执行文件(startup.bat shutdown.bat)
- conf : 配置文件(server.xml)
- lib : tomcat依赖的jar文件
- log : 日志文件(记录出错等信息)
- temp : 临时文件
- webapps : 可执行的项目(将我们开发的项目放入该目录)
- work : 存放由jsp翻译成的java,以及编译成的class文件(jsp ->java->class)
3.服务器常见状态码
- 200:一切正常
- 300/301:页面重定向(跳转)
- 404:资源不存在
- 403:权限不足(如果访问a目录,但是a目录设置不可见)
- 500:服务器内部错误(代码有误)
二、虚拟路径和虚拟主机
配置虚拟路径:apache-tomcat\config\server.xml
1.方式一 需要重启服务器
将web项目配置到 webapps 以外的目录
host标签中:<Context docBase=" " path=" " />
docBase:实际路径
path:虚拟路径(配置虚拟路径要么用绝对路径要么用相对路径(相对于webapps))
例子:<Context docBase="D:\study\JspProject" path="/JspProject" />
2.方式二 不需要重启服务器
D:\study\apache-tomcat\conf\Catalina\localhost
中新建"项目名.xml"
新增一行例子:<Context docBase="D:\study\JspProject" path="/JspProject" />
配置虚拟主机:
80 默认端口号(输入网址可省略)
输入www.xxx.com找localhost:xxx(端口号)
三、JSP执行流程
第一次访问:服务端将jsp翻译成java,再将java编译成class文件
第二次访问:直接访问class文件(如果服务端代码修改了,将会再访问时重新编译)
jsp和Servlet可以相互转换,jsp翻译成的java文件继承HttpJspBase(本质是servlet文件),所以jsp本质就是servlet
早期开发写的就是Servlet,但是太过繁琐,所以采用jsp.
因为第一次请求服务端会有翻译和编译的过程,因此比较慢;后续访问可以直接访问class,因此速度较快.但是如果服务端修改了代码,则再次访问时,会重新翻译、编译.
四、JSP的页面元素
页面元素有 : HTML、java代码(脚本Scriptlet)、指令、注释
1.脚本
1.<%
局部变量、java语句
%>
2.<%!
全局变量、定义方法
%>
3.<%=输出%> 等于 out.print (注意!!!out.println()不能回车,想要回车:"<br/>")
- 一般而言,修改
web.xml
、配置文件、java
代码需要重启tomcat
服务器 - 但是如果修改
jsp
、html
、css
、js
,不需要重启
2.指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
语法格式如下:
<%@ directive attribute="value" %>
指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。
JSP中的三种指令标签
指令 | 描述 |
---|---|
<%@ page … %> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义 |
page
的属性:language
: 指定jsp页面使用的脚本语言import
: 导入类pageEncoding
:jsp文件自身编码 jsp->java(将jsp转成java用的编码)contentType
: 浏览器解析jsp的编码
<%@ page language="java" contentType="text/html"; charset="UTF-8" pageEncoding="UTF-8" import="java.util.Date" %>
3.注释
- html注释
<!-- -->
可以用浏览器查看源码看到的注释 - java注释
// /* */
- jsp注释
<%-- --%>
五、部署tomcat
- 一般建议将eclipse中的tomcat与本地tomcat的配置信息保持一致:
- 将eclipse中的tomcat设置为托管模式:[第一次] 创建tomcat实例后,双击该实例,选择Server
Locations的第二项.
六、JSP九大内置对象(自带的,不需要new也能使用的对象)
1.out: 输出对象,向客户端输出内容.
2.request: 请求对象,存储"客户端向服务端发送的请求信息"
- request是
Servlet.service()
方法的一个参数,类型为javax.servlet.http.HttpServletRequest
。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()
方法时传递给service()
方法,这说明在service()
方法中可以通过request对象来获取请求数据。
a.request对象的常见方法:
方法 | 描述 |
---|---|
String getParameter(String name) | 根据请求的字段名key(input标签的name属性值),返回字段值value(input标签的value属性值) |
String[] getParameterValues(String name) | 根据请求的字段名key,返回多个字段值value (常见为checkbox 多选按钮) |
void setCharactorEncoding(“编码格式utf-8”) | 设置post方式的请求编码(不设置有默认编码,默认编码根据tomcat默认,tomcat7及以前默认iso-8859-1,tomcat8及以后默认utf-8) |
getRequestDispacher(“B.jsp”).forward(request,response) | 请求转发的方式跳转页面 访问A页面跳转到B页面(A->B) |
ServletContext getServerContext() | 获取项目的ServletContext对象(通过request对象获取ServletContext对象) |
示例:
注册功能
register.jsp (注册页) 跳转 show.jsp(展示页)
http://localhost:8888/com.neuedu.firstjsp/show.jsp?uname=zs&upwd=abc&uage=23&uhobbies=%E7%AF%AE%E7%90%83&uhobbies=%E4%B9%92%E4%B9%93%E7%90%83
连接/文件?参数名1=参数值1&参数名2=参数值2&参数名3=参数值3
get提交方式: method="get" 和 地址栏、超链接(<a href="xx">)请求方式 默认都属于get提交方式
b.get与post请求方式的区别:
- 1.get方式在地址栏显示请求信息(地址栏能够容纳的信息有限,其实Http Get方法提交的数据大小长度并没有限制,而是IE浏览器本身对地址栏URL长度有最大长度限制:不同浏览器的限制不同,一般在2k-8K之间.);
- 2.post方式不在地址栏显示请求信息;
- 3.文件上传操作,必须是post方式,get方式会报错.
c.统一请求的编码 :
(1).get方式请求,如果出现乱码,解决方式:
- 1.统一每一个变量的编码(不推荐) new String(旧编码,新编码); (构造器) name = new String(name.getBytes("iso-8859-1","utf-8"));
- 2.修改server.xml,一次性更改tomcat默认编码(在修改端口号的地方,加上URIEncoding="UTF-8"即可)(一般在tomcat7及以前默认iso-8859-1,tomcat8及以后默认utf-8).
建议使用tomcat时,首先在server.xml中统一get方式的编码.
(2).post方式请求,如果出现乱码,解决方式:
- request.setCharacterEncoding("UTF-8");
3.response:响应对象
a.response对象的常见方法
方法 | 描述 |
---|---|
void addCookie(Cookie cookie) | 服务端向客户端增加一个cookie对象 |
void sendRedirect(String location) thows IOException | 页面跳转的一种方式(重定向) |
void setContentType(String type) | 设置服务端响应时编码(设置服务端contentType类型) |
示例:登录
login.jsp(登录页面) -> check.jsp(检查页面,登录判断) -> success.jsp(如果成功跳转到success页面)
response.sendRedirect("success.jsp"); 重定向导致数据丢失,地址栏变成success.jsp
request.getRequestDispatcher("success.jsp").forward(request,response); 请求转发,可以获取数据,并且地址栏没有改变(仍然保留转发时的页面地址栏check.jsp)
b.请求转发和重定向区别
请求转发:
request.getRequestDispatcher().forward();
重定向:
response.sendRedirect();
例如:
请求转发:
request.getRequestDispatcher("/student_list.jsp").forward(request,response);
重定向:
response.sendRedirect(request.getContextPath + "/student_list.jsp")
c.转发过程
- 客户端首先发送一个请求到服务器,服务器匹配
Servlet
,并指定执行。当这个Servlet
执行完后,它要调用getRequestDispacther()
方法,把请求转发给指定的Servlet_list.jsp
,整个流程都是在服务端完成的,而且是在同一个请求里面完成的,因此Servlet
和jsp
共享同一个request
,在Servlet
里面放的所有东西,在student_list.jsp
中都能取出来。因此,student_list.jsp
能把结果getAttribute()
出来,getAttribute()
出来后执行完把结果返回给客户端,整个过程是一个请求,一个响应。
d.重定向过程
-
客户端发送一个请求到服务器端,服务器匹配
Servlet
,这都和请求转发一样。Servlet
处理完之后调用了sendRedirect()
这个方法,这个方法是response
方法。所以,当这个Servlet
处理完后,看到response.sendRedirect()
方法,立即向客户端返回个响应,响应行告诉客户端你必须再重新发送一个请求,去访问student_list.jsp
,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求student_list.jsp
,在这两个请求互不干扰、相互独立,在前面request
里面setAttribute()
的任何东西,在后面的request
里面都获得不了。因此,在sendRedirect()
里面是两个请求,两个响应。 -
Forward
是在服务器端的跳转,就是客户端一个请求给服务器,服务器直接将请求相关参数的信息原封不动的传递到该服务器的其他jsp
或Servlet
去处理。而sendRedirect()
是客户端的跳转,服务器会返回客户端一个响应报头和新的URL
地址,原来的参数信息如果服务器没有特殊处理就不存在了,浏览器会访问新的URL所指向的Servlet
或jsp
,这可能不是原来服务器上的webService
了。
e.总结
1、转发是在服务器端完成的,重定向是在客户端发生的;
2、转发的速度快,重定向速度慢;
3、转发是同一次请求,重定向是两次请求;
4、转发地址栏没有变化,重定向地址栏有变化;
5、转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成。
4.session(存在于服务端):会话对象
- 浏览网站:从开始浏览到关闭是一次会话
- 购物:浏览、付款、退出是一次会话
a.session对象的常见方法:
String getId():获取sessionId
boolean isNew():判断是否是新用户(第一次访问)
void invalidate():使session失效 (退出登录、注销等能用到)
void setAttribute()
Object getAttribute()
void setMaxInactiveInterval(秒):设置最大有效 非活动时间.
int getMaxInactiveInterval():获取最大有效 非活动时间
b.session机制
- 客户端第一次请求服务端时
(Cookie的JSESSIONID
和session
的sessionId
进行匹配),匹配失败,服务端会产生一个session
对象(用于保存该客户的客户信息);并且每个session
对象,都会有一个唯一的sessionId
(用于区分其他session
); - 服务端又会产生一个
Cookie
,并且该Cookie
的name=JSESSIONID
,value=服务端sessionId的值
;
然后服务端会在响应客户端的同时,将该Cookie
发送给客户端,到这里客户端就有了一个Cookie(JSESSIONID)
; - 因此,客户端的
Cookie
就可以和服务端的session
一 一对应(JSESSIONID-sessionId
) - 客户端第二/n次请求服务端时:客户端会先根据客户端
Cookie
中的JSESSIONID
,去服务端的session
中匹配sessionId
匹配,如果匹配成功(Cookie
的JSESSIONID
和session
的sessionId
),说明此用户不是第一次访问,无需登录,如果不匹配,说明没登陆过.
c.总结:
session
存储在服务端(客户请求时,由服务端产生)session
是在同一个用户(客户)请求时共享(就是已经登陆过一次的用户,不需要再次登录,JSESSIONID
和sessionId
共享)- session的实现机制:第一次客户请求时,服务端产生一个
sessionId
并复制给Cookie
的JSESSIONID
然后发送给客户端,最终通过JSESSIONID
和sessionId
实现一一对应的关系
d.Cookie和session的区别:
session | cookie | |
---|---|---|
保存的位置 | 服务端 | 客户端 |
安全性 | 较安全 | 较不安全 |
保存的内容 | Object | String |
Cookie
(存在于客户端,但不是客户端产生的)Cookie
不是内置对象(需要new)
:Cookie
是由服务端产生的,再发送给客户端保存.Cookie
相当于本地缓存的作用: 客户端(在第二次访问网站时,可以直接在本地访问信息)→
服务端(第一次访问网站,服务端把信息放到Cookie
里面发送给客户端)Cookie
可以提高访问服务端的效率,但是安全性较差(账号密码存储到本机)Cookie
:key(name)=value
包含键值对(KV
对)javax
.servlet.http.Cookie
(是javax
类产生的对象)
Cookie
一、Cookie方法:
public Cookie(String key(name) ,String value) Cookie的构造方法
String getName() 获取name
String getValue() 获取value
void setMaxAge(int expiry) 设置最大有效期 (秒)
二、Cookie过程:
1.服务端准备Cookie
:
增加Cookie
是response
response.addCookie(Cookie cookie)
2.页面跳转(请求转发,重定向都可以把Cookie
给客户端)
3.获取Cookie
是request
客户端获取Cookie
:
request.getCookies()
三、Cookie总结:
1.服务端增加Cookie:response
对象;客户端获取Cookie:request
对象
2.不能直接获取某一个单独对象,只能一次性将全部的Cookie
拿到
通过查看源代码→网络→消息头→过滤消息头 中的信息发现,除了自己设置的Cookie
对象外,还有一个name
为JSESSIONID
的Cookie
建议cookie
只保存英文、数字,否则需要进行编码、解码处理.
四、使用Cookie
的经典案例
使用Cookie
记住用户名功能
login.jsp
(客户端):
check.jsp
(服务端):
A.jsp
(客户端):
5.pageContext:JSP页面容器
6.application:全局对象
String getContextPath():虚拟路径
String getRealPath(String name):绝对路径(虚拟路径相对的绝对路径)
7.config:配置对象(服务器配置信息)
8.page:当前JSP页面对象(相当于java中的this)
9.exception:异常对象
七.四个范围对象:(小->大)
- 1.
pageContext
: JSP页面容器 (说page对象其实是在说pageContext不是内置对象的page):当前页面有效 - 2.
request
: 请求对象 :同一次请求有效 - 3.
session
: 会话对象 :同一次会话有效 - 4.
application
: 全局对象 : 全局有效(整个项目有效)
四个对象公有的方法
Object getAttribute(String name):根据属性名,获得属性值
void setAttribute(String name,Object obj):设置属性值(可以新增也可以修改)
例如: setAttribute("A","B") ; //如果A对象之前不存在,则新建一个A对象;如果A对象之前已经存在,则将A对象的值修改为B;
void removeAttribute(String name) : 根据属性名,删除对象
- 1.pageContext 当前页面有效(页面跳转后无效)
- 2.request 同一次请求有效;其他请求无效(请求转发后有效,重定向后无效)
- 3.session 同一次会话有效 (无论怎么跳转,都有效;关闭或切换浏览器后无效; 从登陆到退出之间都有效)
- 4.application 全局变量 ,整个项目运行期间都有效(切换浏览器仍然有效);关闭服务或者其他项目访问无效.
多个项目共享、重启后仍然有效 : JNDI 可以做到