JSP
Posted tripleWen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP相关的知识,希望对你有一定的参考价值。
tomcat解压后目录
bin:可执行文件(startup.bat shutdown.bat)
conf:配置文件(server.xml)
lib:tomcat依赖的jar文件
log:日志文件(记录出错等信息)
temp:临时文件
webapps:可执行的项目(将我们开发的项目放入该目录)
work:存放由jsp翻译成的java,以及编译成的class文件
配置tomcat
a.配置jdk (必须配置JAVA_HOME)
JAVA_HOME CLASSPATH PATH
b.配置CATALINA_HOME
访问Tomcat
在浏览器的地址栏中输入
Tomcat服务器的IP地址(或域名)、端口号、Web服务目录和JSP页面的名字
(项目根目录:静态资源文件放在根目录下的,外界能够直接请求获取
即:浏览器可以直接访问WebContent中的文件
Web-INF:资源受保护,外界不能直接请求获取,只能通过服务器获取再响应给用户,只能通过请求转发来访问
注意:并不是任何的内部跳转都能访问WEB-INF;原因是:跳转有2种方式:请求转发、重定向)
修改端口号
在conf配置文件server.xml中修改如下代码:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
//双击bin/startup.bat启动tomcat
//常见错误:可能与其他服务的端口号冲突
//tomcat端口号默认8080(此端口号较为常见,容易冲突,建议修改此端口)
常见状态码
200:一切正常
300/301:页面重定向(跳转)
404:资源不存在
403:权限不足
500:服务器内部错误(代码有误)
HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:
分类 |
分类描述 |
1** |
信息,服务器收到请求,需要请求者继续执行操作 |
2** |
成功,操作被成功接收并处理 |
3** |
重定向,需要进一步的操作以完成请求 |
4** |
客户端错误,请求包含语法错误或无法完成请求 |
5** |
服务器错误,服务器在处理请求的过程中发生了错误 |
设置默认的初始页面
在项目/WEB-INF/web.xml中编写
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
虚拟路径:
(将项目复制到webapp目录下,缺点:服务器启动很慢、如果其中有一个项目是错误的就会导致整个服务器无法启动)
将web项目配置到webapps以外的目录
a.方式一
conf/server.xml中配置(主配置文件server.xml修改后,必须重新启动Tomcat服务器)
host标签中:
<Context docBase="实际路径" path="虚拟路径(绝对路径、相对路径[相对于webapps])"/>
(若存在多个<Context>,必须保证多个<Context>的path值不同)
(注:docBase的值不是项目路径,而是资源路径)
b.方式二
...\\apache-tomcat-8.5.34\\conf\\Catalina\\localhost
中新建“项目名.xml”内容为:
<Context docBase="...\\WebContent"/>
相当于
<Context path=”demo” docBase=”...\\WebContent”/>
(path的值就是xml的名称 )
虚拟主机(了解)
例如:通过www.test.com访问本机
conf/server.xml
<Engine name="Catalina" defaultHost="www.test.com">
<Host name="www.test.com" appBase="实际路径">
<Context docBase="实际路径" path="/"/>
</Host>
C:\\Windows\\System32\\drivers\\etc\\host
增加 127.0.0.1 www.test.com
流程: www.test.com -> host找映射关系 -> server.xml找Engine的defaultHost -> 通过"/"映射到实际路径>
JSP执行流程
jsp - java(Servlet文件) - class
...\\apache-tomcat-8.5.34\\work\\Catalina\\localhost\\项目名\\org\\apache\\jsp
JSP和Servlet可以相互转换
第一次访问:服务端将jsp翻译成java,再将Java编译成class文件
第二次访问:直接访问class文件(如果服务端代码修改了,将会再访问时重新翻译、编译)
配置tomcat运行时环境
jsp<->servlet
a.将tomcat/lib中的servlet-api.jar加入项目的构建路径
b.右键项目 -> Build Path -> Add library -> Server Runtime
部署tomcat
在servers面板新建一个tomcat实例,再在该实例中部署项目(右键add)之后运行
注意:一般建议将eclipse中的tomcat与本地tomcat的配置信息保持一致:将eclipse中的tomcat设置为托管模式:第一次创建tomcat实例之后,双击,选择Server Location的第二项
统一字符集编码
编码分类:
设置jsp文件的遍历(jsp文件中的pageEncoding属性): jsp -> java
设置浏览器读取jsp文件的编码(jsp文件中content属性)
一般将上述设置成一致的编码,推荐使用UTF-8
文本编码:
**将整个eclipse中的文件统一设置(推荐)
Window -> Preference -> Jsp Files -> Encoding
**设置某一个项目
**设置单独文件
JSP的页面元素:
a.脚本Scriptlet
<% 局部变量、java语句 %>
<%! 全局变量、定义方法 %>
<%= 输出表达式 %>
(一般而言,修改web.xml、配置文件、java 需要重启Tomcat服务,修改jsp、html、css、js 不需要重启)
b.注释
html注释 <!-- --> 可以被客户通过浏览器查看源码所观察到
java注释 // /* …… */
jsp注释 <%-- --%>
c.jsp指令
jsp标记
指令标记page
<%@ page 属性1=“属性1的值” 属性2=“属性2的值” … %>
//属性contentType的值:
在JSP页面中page指令只能为contentType指定一个值,以此确定响应的MIME类型.如:
contentType属性的值为“text/html;charset=GB2312”,客户的浏览器启用HTML解析器来解析执行收到的信息
contentType属性的值为“application/msword”,客户的浏览器将启动本地的Word应用程序来解析执行收到的信息
contentType属性的值为“image/jpeg”,客户的浏览器将启动图形解码器来解析执行收到的信息
//属性import的值:
为JSP页面引入java核心包中的类
//属性language的值:
language属性的默认值是"java"
//属性session:
session属性的值用于设置是否需要使用Tomcat服务器内置的session对象,默认属性值是true
//属性buffer:
内置输出流对象out负责将服务器的某些信息或运行结果发送到客户端显示,默认值是8KB
//属性autoFlush:
autoFlush属性指定out流的缓冲区被填满时,缓冲区是否自动刷新,默认值是true
//属性isThreadSafe
默认值是true,即一个客户机的线程没有执行完毕,CPU的使用权也可能要切换给其他线程
指令标记include
(用嵌入方式处理文件,在编译阶段就处理所需文件,优点是页面的执行速度快)
<%@ include file="文件的URL" %> 作用是在JSP上出现该指令的位置处静态嵌入一个文件
(静态嵌入: Tomcat服务器在编译阶段就完成文件的嵌入操作)
动作标记include
(不使用嵌入方式来处理所需文件,在JSP页面运行时才处理文件,即当Tomcat服务器把JSP页面转译成java文件是,告诉java解释器,这个文件在java文件的字节码文件被加载执行时才被处理,缺点是执行速度要慢一些)
include动作标记要处理的文件如果不是JSP文件,就将文件的内容发送到客户机,由客户机负责执行并显示
格式: <jsp:include page="文件的URL" />
或 <jsp:include page="文件的URL">
子标记
</jsp:include>
动作标记param
可以作为include、forward动作标记的子标记来使用
格式: <jsp:param name="名字" value="指定给name属性的值" />
动作标记forward
作用:从该标记出现处停止当前JSP页面的继续执行,而转向执行forward动作标记中page属性所指定的JSP页面
格式: <jsp:forward page="要转向的页面" />
或 <jsp:iforward page="要转向的页面">
param子标记
</jsp:include>
动作标记useBean
用来创建并使用一个JavaBean,Sun公司倡导的是:用HTML完成JSP页面的静态部分,用JavaBean完成动态部分
Tag文件与Tag标记
(Tag文件,在设计Web应用时,可以通过编写Tag文件来实现代码复用)
Tag文件的结构:Tag文件的扩展名为.tag的文本文件,其结构几乎与JSP文件相同
Tag标记: 格式: <Tag文件的名字/>
或 <Tag文件的名字>
标记体
<Tag文件的名字/>
Tag文件中的常用指令: tag、taglib、include、attribute、variable
Tag标记的使用:
(把这些Tag文件存放到Tomcat服务器指定的目录中,即存放到"Web服务目录\\WEB-INF\\tags"中,其中的WEB-INF和tags都是固定的子目录名称。tags或其下的子目录是专门存放Tag文件的,而一个Tag文件对应一个Tag标记,称tags或其下的子目录为一个标记库)
<taglib>指令标记引入标记库,一个JSP页面可以使用几个<taglib>指令标记引入若干个标记库
格式: <%@taglib tagdir="自定义标记库的位置" prefix="前缀" %>
<前缀:Tag文件名字 />
例:将FirstTag.tag存放在tags目录中,而SecondTag存放在tags的子目录tagsTwo中
demo.jsp
<%@page contentType="text/html;Charset=GB2313" %>
<%@taglib tagdir="/WEB-INF/tags" prefix="com" %>
<%@taglib tagdir="/WEB-INF/tags/tagTwo" prefix="game" %>
<HTML>
<BODY>
<H3>以下是调用FirstTag.tag文件的效果</H3>
<com:FirstTag />
<H3>以下是调用SecondTag.tag文件的效果</H3>
<game:SecondTag />
</BODY>
</HTML>
JSP九大内置对象(自带的,不需要new也能使用的对象)
●request: 请求对象;存储"客户端向服务端发送的请求信息"
request对象的常见方法:
String getParameter(String name) |
根据请求的字段名返回字段值value |
String[] getParameterValues(String name) |
根据请求的字段名key,返回多个字段值value (checkbox) |
void setCharacterEncoding("编码格式utf-8") |
设置post方式的请求编码 (tomcat7以前默认iso-8859-1,tomcat8以后改为了utf-8)
|
getRequestDispatcher("b.jsp").forward(request,response) |
请求转发的方式跳转页面 a -> b,可以获得数据,并且地址栏没有改变 |
getServerContext() |
获取项目的ServletContext对象 |
(get与post请求方式的区别:
a. get方式在地址栏显示请求信息,但是地址栏能够容纳的信息有限,4-5KB;如果请求数据存在 大文件、图片等,会出现地址栏无法容纳全部的数据而出错)
b. 文件上传操作,必须是post
统一请求的编码request (如果出现乱码,解决:)
get方式请求,则 在server.xml中统一get方式的编码.. URIEncoding="UTF-8"
post方式请求,request.setCharacterEncoding("utf-8");
●response: 响应对象
提供的方法:
void addCookie(Cookie cookie): 服务端向客户端增加cookie对象
void sendRedirect(String location) throw IOException: 页面跳转的一种方式(重定向),导致数据丢失
void setContentType(String type): 设置服务端响应的编码(设置服务端的contentType类型)
|
请求转发 |
重定向 |
地址栏是否改变 |
不变 |
改变 |
是否保留第一次请求时的数据 |
保留 |
不保留 |
请求的次数 |
1 |
2 |
跳转发生的位置 |
服务端 |
客户端发出的第二次跳转 |
●session: 会话对象
a.session存储在服务端
b.session是在同一个客户请求时共享
c.实现机制:客户端第一次请求服务端时,服务端会产生一个session队形用于保存客户的信息,服务端会产生一个cookie,并且该cookie的name=JSESSIONED,value=服务端sessionid的值,然后服务端会再响应客户端的同时,将该cookie发送给客户端。客户端第2/n次请求服务端时,服务端会先用客户端cookie中的JSESSIONID去服务端的session中匹配sessionid。
Cookie (存在客户端,不是内置对象): Cookie是由服务端生成的,再发送给客户端保存,相当于本地缓存的作用
Cookie 由 javax.servlet.http.Cookie 类产生的
public Cookie (String name,String value)
String getName(): 获取name
String getValue(): 获取value
void setMaxAge (int expiry): 最大有效期(秒)
|
服务端准备Cookie: response.addCookie(Cookie cookie)
页面跳转(转发,重定向)
客户端获取Cookie: request.getCookie( );
不能直接获取某一个单独对象,只能一次性将全部的cookie拿到
通过F12可以发现,除了自己设置的Cookie对象外,还有一个name为JSESSIONID的cookie
(建议cookie只保存英文数字,否则需要进行编码)
session方法:
String getId() : 获取sessionId
boolean isNew() : 判断是否是新用户
void invalidate() : 使session失效
void setMaxInactiveInterval(秒) : 设置最大有效非活动时间
int getMaxInactiveInterval() : 获取最大有效非活动时间
void setAttribute()
Object getAttribute()
●application: 全局对象
String getContextPath() : 虚拟路径
String getRealPath(String name): 绝对路径(虚拟路径相对的绝对路径),参数是虚拟路径
●out: 输出对象,向客户端输出内容
●page: 当前JSP页面对象(相当于java中的this)
●pageContext : JSP页面容器
●config: 配置对象
●exception: 异常对象
JSP作用域范围从小到大: (作用域:对象的声明周期和可访问性)
pageContext : 当前页面有效
request: 同一次请求有效 (请求转发后有效,重定向后无效)
session: 同一次会话有效 (无论怎么跳转都有效,关闭/切换浏览器后无效)
application : 整个项目运行期间有效 (切换浏览器仍然有效,关闭服务/其他项目无效)
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
以上是关于JSP的主要内容,如果未能解决你的问题,请参考以下文章
JSP基础
day06-jsp
jsp
JSP语法
JSP 语法
JSP 基础语法