Jsp基础

学习慕课网的《JAVA遇见HTML——JSP遍》所做的笔记,http://www.imooc.com/learn/166

希望有用,有误的地方望指出,谢谢


JSP:Java Server Pages
(一)JSP简介
Jsp是一种动态网页技术,JSP与Servlet一样都是在服务器端执行

(二)Jsp基础语法
<1>、Jsp页面元素构成
静态内容、指令、表达式、小脚本、声明、注释
一、Jsp指令和动作元素 
1、page指令:通常位于jsp页面的顶端,同一个页面可以又多个page指令
page命令常用三个属性:language,import,contentType
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"%>
contentType的charset是指服务器发给客户端的内容编码,更常用
pageEncoding是jsp文件本身的编码

2、include指令:将一个外部文件嵌入到当前jsp文件中,同时解析这个页面中的jsp语句
a、include指令语法:<%@ include file = "fileName"%>
b、include动作标签语法:<jsp:include page="URL要包含的页面" flush="true|false"/>
flush 表示是否从缓冲区中读入
c、include指令与include动作的比较
include指令                                          include动作
语法格式:include指令 <%@ include file="..." %>       include动作 <jsp:include page="..." />
发生作用的时间: include指令在页面转换期间,          include动作在请求期间
包含的内容: include指令包含文件实际内容              include动作包含页面的输出
转换成的Servlet: include指令主页面和包含页面转换为一个Servlet,include动作主页面和包含页面转换为独立的Servlet
编译时间: include指令较慢(因为资源必须被解析),           include动作较快
执行时间: include指令较快,       include动作较慢(因每次资源必须被解析)

3、taglib指令:使用标签库定义新的自定义标签, 在Jsp页面中启动定制行为

4、forward动作
<jsp:forward page="URL">
等同于服务器内部跳转指令request.getRequestDispatcher("/URL").forward(request,response)

1、param参数
这个是forward的一个子标签,用于在跳转到新的页面去前携带新的属性
<jsp:param value=" " name=" ">

如:<jsp:forward page="url"> 
<jsp:param value="123@qq.com" name="email"/> 
</jsp:forward>

<2>、Jsp注释
1、html注释<!-- -->客户端可见
2、jsp注释 <%-- --%> 客户端不可见
3、jsp脚本注释 单行// 和 多行/* */ 客户端不可见
【注意】需要嵌套在<%    %>中使用
<%   //单行注释        
 /*多行注释*/  
%>
<3>、Jsp脚本(在Jsp页面中执行的java代码)
1、语法  <%   %>  之间的java代码
<%
out.println("欢迎学习JavaEE开发!");
%>
2、Jsp声明   <%!   %>  之间的java代码
<%!
String s = "Jsp声明"; //声明一个字符串变量
int add(int a, int b) { //声明一个求和函数
return a + b;
}
%>
<4>、Jsp表达式
语法: <%=表达式%>  //注意: 表达式不以分号结束

<5>、Jsp生命周期
        |用户发出请求index.jsp|
|
———<—否—— |是否是第一次请求|  ——是—>———|Jsp引擎把该Jsp文件转换成为一个Servlet,|
|                   |生成字节码文件,并执行jspInit()                    |
—————>———————|生成的字节码文件|———————<———
                   |
                              |解析执行,jspService()|
【注意】第一次请求一个jsp页面时,首先被执行的方法是构造方法
1、生成字节码文件,执行jspInit()只在第一次请求时执行,重复请求仅只执行一次。生成的文件在Tomcat的work目录下,
【每次修改会重新编译,生成新的字节码文件】
2、jspService()用于处理用户请求,对于每一个请求,JSP引擎会创建一个新的线程来处理该请求
【JSP多线程:降低资源需求,提高系统并发量及响应时间,但注意同步问题】
3、由于该Servlet常驻于内存里,所以响应速度非常快。

(三)Jsp内置对象
<1>、内置对象简介
JSP对象是Web容器创建的一组对象,【不使用new关键字】就可以使用的内置对象。例如:out

<2>、四种作用域范围
作用域范围从小到大顺序:
pageContext----request----session----application
1、pageContext:
作用域仅限于当前页面对象,可以近似于理解为java的this对象,离开当前JSP页面(无论是redirect还是forward),
则pageContext中的所有属性值就会丢失。
2、request:
作用域是同一个请求之内,在页面跳转时,如果通过forward方式跳转,则forward目标页面仍然可以拿到request中的属性值。
如果通过redirect方式进行页面跳转,由于redirect相当于重新发出的请求,此种场景下,request中的属性值会丢失。
3、session:
session的作用域是在一个会话的生命周期内,会话失效,则session中的数据也随之丢失。
application:
作用域是最大的,只要服务器不停止,则application对象就一直存在,并且为所有会话所共享。

<3>、out对象
1、out对象是JspWriter类的实例,是向客户端(这里指浏览器)输出内容的常用对象。
2、常用方法:
· void println()向客户端打印字符
· void clear()清除缓冲区的内容。如果在flush之后调用,会抛出异常
· void clearBuffer() 也是清除缓冲区内容,但在flush之后不会抛出异常
· void flush()将缓冲区内容输出到客户端
· int getBufferSize()返回缓冲区的大小(字节数),如不设缓冲区则为0
· int getRemaining()返回缓冲区还剩余多少可用
· boolean isAutoFlush()返回缓冲区满时,是否自动清空缓冲区
· void close()关闭输出流
<4>、request、response和请求转发、请求重定向
a、request对象
客户端的请求信息被封装在Request对象中,通过它才能了解到客户的需求,然后做出响应。
它是HttpServletRequest类的实例。Request对象具有请求域,即完成客户端的请求前,该对象一直有效。
常用方法如下:
. String getParameter()//返回name指定参数的参数值;
. String[] getParameterValues()//返回包含参数name的所有值的数组;
. void setAttribute()//存储此请求中的属性;
. object getAttribute()//返回指定属性的属性值;
. String getContentType//得到请求体的MIME类型;
. String getProtocol()//返回请求用的协议类型及版本号;
. String getServerName()//返回接受请求的服务器主机名;
. int getServerPort();//返回服务器接受此请求所用的端口号
. String getCharacterEncoding();//返回字符编码方式
. void setCharacterEncodinng();//设置请求的字符编码方式
. int getContentLength();//返回请求体的长途(以字节数)
. String getRemoteAddr();//返回发送此请求的客户端IP地址
. String getRealPath(String path);//返回虚拟路径的真实路径
. String getContextPath();//返回上下文路径

8. <a href="request.jsp?username=tom"/>通url传递参数的方法 n</a>


b、response对象
response对象包含了响应客户请求的有关信息,是HttpServletResponse类的实例。
response对象具有页面作用域,即在一次访问中该页面的response只能对该访问有效,
其他页面的response对象对当前页面无效。
response对象的常用方法 
. String getCharactrerEncoding()返回响应字符编码
. void setContentType() 设置响应的MIME 类型
. PrintWriter getWriter()返回可以向客户端输出的一个对象
response,getWriter()返回一个printWriter对象,
这个对象也可以像用户输出字符的一个对象,但它在jsp的内置对象out之前输出,
要想out在printWriter对象前输出可以使用flush()清空缓存区强制输出。
. sendRedirect(java.lang.String location)重定向客户端的请求
response的sendRedirect("..jsp")可将这个response的页面跳转到你想要他跳转的页面。

c、请求转发、请求重定向
1、请求重定向:客户端行为,response.sendRedirect(),本质上两次请求,
前一次的请求对象不会保存,地址栏的URL地址会改变;
客户向服务器A发送请求,再向服务器B发送请求得到回馈信息。
2、请求转发:服务器行为,request.getRequestDispatcher("request.jsp").forward(req, resp);
是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变;
只是服务器A将客户提交的数据转发给服务器B处理得到回馈信息,再返回给客户。
【总结1】重定向是response对象的方法而请求转发是request对象的方法。

<5>、session会话
1、session表示客户端与服务器的一次会话
2、Web中的session指:用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览网站所花费的时间。
3、从上述定义中可以看到,session实际是一个【特定的时间概念】
4、session是存放在服务器内存中,不同用户对应不同的session

session的生命周期为:
a.创建:当客户端第一次访问某个jsp或servlet时,服务器会为当前会话创建一个SessionId,
每次客户端向服务端发送请求时,都会将此sessionID携带过去,服务端会对此SessionI的进行校验
b.活动:1、某次会话中通过超链接打开的新页面仍属于同一次会话。
2、只要当前会话页面没有全部关闭,重新打开新的浏览器访问同一项目的的资源时人数与同一次会话。
3、除非将本次会话的所有页面都关闭后再重新访问某个jsp或者servlet将会创建新的会话。
【注意】原有会话仍存在,只是这个旧的sessionId仍存在与服务器内存中,只不过再没有客户端携带它然后交予服务器校验
c.销毁:(有三种方式)1、调用session.invalidate()方法
2、session超时(Tomcat默认的session超时时间为30分钟)
I、session.setMaxInactiveInterval(10);//10秒钟session失效
II、在web.xml配置
<session-config>
<session-timeout>10</session-timeout>  //单位是分钟
</session-config>
3、服务器重新启动。

<6>、application对象
1、application对象实现了用户间数据的共享,可存储全局变量。
2、application开始于服务器的启动,终止于服务器的关闭,
3、在用户的前后或不同用户之间的连接中,可以对application对象的同一属性进行操作,
在任何地方对application对象属性的操作,都会影响到其他用户对此的访问。
4、application对象是ServletContext类的实例。
5、application属于服务器,不属于某一个具体的用户
application常用方法:
. void setAttribute(String name, Object value) 使用指定名称将对象绑定到此会话(为此会话添加application对象属性)
. public Object getAttribute(String name) 返回此次会话中指定名称的对象。如果没有对象绑定在该名称,则返回null
. Enumeration getAttributeNames() 返回所有可用属性名的枚举
. String getServerInfo() 返回JSP(SERVLET)引擎名及版本号

<7>、其他内置对象(page、pageContext、exception、config)
1、page对象
page对象,类似Java的this对象 在Java的object包下,继承object的方法
常用方法如下:
. class getClass(); //返回此Object类
. int hashCode(); //返回此Object的hash码
. boolean equals(Object obj); //判断此Object是否与指定的Object对象相等
. void copy(Object obj); //把此Object复制到指定的Object对象中
. Object clone(); //克隆此Object对象
. String toString(); //把此Object对象转换为String类的对象
. void notify(); //唤醒一个等待的线程
. void notyfyAll(); //唤醒所有等待的线程
. void wait(int timeout); //使一个线程处于等待直到timeout结束或被唤醒
. void wait(); //使一个线程处于等待直到被唤醒

2、pageContext对象
a、pageContext提供了对JSP页面内所有的对象及名字空间的访问
b、pageContext对象可以访问到本页所在的session,也可以取本页面所在的application的某一属性值,
c、pageContext对象的本类就是pageContext
d、pageContext对象相当于页面中所有功能的集大成者

3、config对象
是在一个Servlet初始化时,JSP引擎向他传递信息用的,此信息包括Servlet初始化时要用到的参数(通过属性名和属性值构成)
以及服务器的有关信息(通过传递一个ServletContext对象)

4、exception对象
Exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生了这个对象,
如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译,他实际上是java.lang.Throwable的对象。
注意在声明语句中将isErrorPage()设置为true才能打印出exception内容。

同时在exception测试页面中要声明errorPage跳转到打印异常页面。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" errorPage="exception.jsp"%>

(四)JavaBeans类
Javabean既可以封装数据同时也可以封装业务逻辑。
一、Jsp动作元素
JSP动作元素为请求处理阶段提供信息。动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性,可选的内容、与开始标签匹配的结束标签。
与Javabeans有关的JSP动作属性有<jsp:useBean><jsp:setProperty><jsp:getProperty>

二、useBean动作元素
<jsp:useBeans>作用是在jsp页面中实例化或者在指定范围内使用javabean;
使用方法:<jsp:useBean id="标识符" class="java类名(package+class_name) scope="作用范围"/>

三、setProperty
<jsp:setProperty>作用是给已经实例化的javabean对象的属性赋值,一共有四种形式。
1.<jsp:setProperty name="javaBean实例名" property="*"/> 根据表单自动匹配属性
2.<jsp:setProperty name="javaBean实例名 property="javaBean属性名"/> 根据表单匹配所有的部分属性
3.<jsp:setProperty name="javaBean实例名 property="javaBean属性名" value="BeanValue" /> 手工设置属性值,与表单没有关系
4.<jsp:setProperty name="JavaBean实例名" property="propertyName" param="request对象中的参数名"/>
其中param指的是request对象的参数名,可以通过URL传递过来

四、getProperty
<jsp:getProperty property="想要获取的属性" name="对象">

五、JavaBean四个作用域范围
使用useBeans的scope属性可以用来指定javabean的作用范围:
. scope="page" 仅在当前页面有效(重定向或者服务器内部转发均后均无效)
. scope="request" 可用request.getAttribute()方法获得javabean对象。在当前请求及服务器转发后的请求中有效。
. scope="session" 可用session.getAttribute()方法获得javabean对象。在当前会话session有效期间,该对象均有效。
. scope="application" 可用application.getAttribute()方法获得javabean对象。范围最广
-- 作用域范围从小到大依次为:page < request < session < application.

六、Model1模型
Model1模型是使用JSP+javabeans模式。客户发送请求到JSP页面,由JSP页面直接连接数据库则可维护性和扩展性太差,
因此通过JSP页面调用javabeans来访问数据库,则可以维护这个系统的扩展性,再由JSP页面返回给客户

I、Model1分为三层:
a.界面层:由JSP页面进行与客户端浏览器的交互,可以直接调用JavaBeans
b.业务逻辑层:由JavaBeans进行处理业务逻辑,封装数据,并与数据库层进行交互
c.数据库层:底层数据库,可被javaBeans访问

II、优点
1、避免了JSP页面直接进行业务逻辑处理所带来的维护性,扩展性差的弱点.体现了分层设计的思想
2.Javabean的出现可以使jsp页面中使用javabean封装的数据或者调用javabean的业务逻辑代码,这样大大提升了程序的可维护性。

(五)Jsp状态管理
一、http协议的无状态性
当浏览器向服务器发送一次请求时,服务器响应客户端请求,
但是当同一个浏览器再次发送请求给服务器是,服务器并不能只懂啊这是刚才那个浏览器。

二、保存用户状态的两大机制
I、Session
II、Cookie
a、cookie机制指的是web服务器在客户端保留的一系列文本信息
. 保存用户对象的追踪;
. 保存用户网页浏览记录与习惯;
. 简化登录;
. 容易泄露用户信息;

b、JSP创建和使用cookie:
1.创建cookie对象:
Cookie newCookie = new Cookie(String key,Object value);
2.写入Cookie对象
response.addCookie(newCookie);
3.读取Cookie对象
Cookie[] cookies=request.getCookies();

III、Session和Cookies的区别
1、保存位置:session在服务器端内存,cookie在客户端文本
2、保存对象:session保存Object类,cookie保存String
3、生存权:session会话结束即销毁,cookie可以长期保存在客户端
4、重要性:session安全性更高,保存重要信息,cookie保存不重要的信息

【实战中小技巧】
一、修改项目虚拟路径
1、右键项目的"properties"—— ——搜索"Web"—— —— 修改"Web Context Root" 
2、重新部署,点击"Manager Deployments" 后 "remove"删除然后重新"add"
3、启动Tomcat之后,在浏览器中输入http://localhost:8888/setmypath/
【setmypath是本人修改的虚拟路径名字】
验证:可以在Tomcat的webapps目录中看到setmypath项目
二、新建Dynamic Web Project项目注意事项
如果你是用的MyEclipse的web project的话,content directory的值默认为WebRoot,
你需要修改为WebContent,因为我们的脚本都是按照WebContent来写的。
三、修改Tomcat服务器默认的端口号
修改Tomcat中conf/server.xml文件的port的值
<Connector port="8888" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443" />
四、快捷键:
1、自动填充代码: Alt + "/"
五、解决传参中文乱码问题
1.解决url传参中文乱码问题,修改Tomcat的server.xml,<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" 
URIEncoding="utf-8"/>
2.表单提交数据参数 中文乱码,request.setCharacterEncoding("utf-8");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值