您的位置:首页 > Web前端 > JavaScript

jsp基础知识小结

2017-04-25 22:52 274 查看

一、jsp内置对象及方法

jsp内置对象:是web容器创建的一组对象,不使用new关键字就可以使用的内置对象。

jsp九大内置对象:out,request,response,session,application这几个比较常用,还有

Page,pageContext,excepton,config。

用户请求(request)

服务器响应(response)

缓冲区:内存当中用来保存临时数据的一块区域。

out对象

out 对象是JspWriter类的实例,是向客户端输出内容常用的对象。

常用方法如下:

void println() 客户端打印字符串

void clear()清除缓冲区的内容,如果在flush之后调用会抛出异常

void clearBuffer()清除缓冲区的内容,如果在flush之后调用不会抛出异常

void flush()将缓冲区内容输出到客户端

int getBufferSize()返回缓冲区以字节数的大小,如不设缓冲区则为0

int getRemaining()返回缓冲区还剩余多少可用

boolean isAutoFlush()返回缓冲区满时,是自动清空还是抛出异常

void close()关闭输出流

在java se中我们知道,如果某句语句抛出异常,则接下去的语句都不会被执行

get和post

get与post提交方式的区别:

get:明文提交数据,安全性较低,提交数据不超过2KB,效率高,适用于搜索、查询功能。

post:将用户提交的信息封装在HTML HEADER内,安全性高,提交数据量大,适合于注册、修改、上传功能。

<%! %>和<% %>

JAVA中<%! %>和<% %>的区别?

<%! %>是jsp中嵌入的java 声明。

用于声明脚本语言变量或方法。

而<% %>是jsp种嵌入的java 脚本代码片段。

最主要的区别是jsp文件在编译成java时他们的构造时间不一样。先构建声明块,然后是jsp的page、request等

内建对象,然后才是java代码块。所以<%! %>中不可以使用JSP内建对象,而<% %>中的代码可以使用jsp的page、request等内建对象。

jsp 都是解析成.java文件`

具体代码请看

如果你写

<%int a=1;%>


生成的代码是

public class xxx_jsp {
public void doProcess(...) ..
{
int a =1; //这是你在jsp 里的代码
}
}


如果你写的是

<%!
int a=1;
%>


生成代码为

public class xxx_jsp {
int a =1; //这是你在jsp 里的代码
public void doProcess(...) ..
{
...
}
}


request对象

request对象常用方法:

用户提交数据后用request.getParameter(String name)获取[pəˈræmɪtɚ]

使用request对象的getParameterValues()方法实现复选框信息获取数据集合

获取mimy值用getContentType();

获取协议名getProtocol();

获取服务器名getServerName();

获取服务器的端口号用getServerPort();

客户端的ip地址getRemoteAddr();

设置编码 request.setCharactEncoing()。

提交表单解决中文乱码问题:

<%
request.setCharacterEncoding("utf-8");//如果是通过url传递中文则无法通过这种方法解决,必须通过tomcat配置文件才行
%>


response对象

response对象包含了响应客户请求的有关信息,但在jsp中很少直接使用,它是HttpServletResponse类的实例。

response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的

response对象对当前页面地无效。

常用方法:

response.setContentType()设计响应的MIME类型

PrintWriter response.getWriter()获得输出流对象

response.sendRedirect(”login.jsp”)客户端请求重定向,转向一个新的页面

out对象的println()方法与PrintWriter对象输出方法

out对象的println()方法与PrintWriter对象输出方法的区别:printWriter对象输出的内容总是优先于out内置

对象输出的内容显示,如果想让out内置对象的输出方法先显示在浏览器上,可以在其后面加上out.flush()语句用来清除缓冲区,与此同时会将内容显示在浏览器上。

请求重定向与请求转发的区别

请求重定向:即response.sendRedirect(“response.jsp”),是一种客户端行为,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变。

请求转发:即request.getRequestDispatcher(“resquest.jsp”).forward(resquest.response),是一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后,服务器端再将响应发给客户端;

session对象

1.session表示客户端与服务器的一次会话(从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开服务器结束,这一过程称之为一个会话)

2.Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间

3.从上述定义中可以看到,session实际上是一个特定的时间概念

4.session保存在服务器的内存中,和用户是一一对应的

5.当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。

6.session对象是HttpSession类的实例。

7.session.setMaxInactiveInterval(10) //设置当前session最大生命周期为10秒 单位是秒

session是有生命周期,我们经常也会碰到这样的情况,如登录到一个网站后,如果停留不动,几个小时后刷新页面,它会让你重新登录,这就是因为session的最大生命周期被设置为几个小时了。

session死亡发生在以下情况:

1.session的持有者(即客户端浏览器)在最大无活动等待时间(MaxInactiveInterval)内无任何响应或请求

2.session被调用invalidate()方法强制死亡了

3.jsp服务器重起或发生中断(此时应该是所有session都死亡)

用户关闭浏览器后标志着:

a.session将不再发送请求到服务器

b.该session将不会有人调用他的invalidate()方法

所以,此时只能等待session自己超时死亡,如果设置了该session的MaxInactiveInterval为-1,那么这个session只有在第3种情况下才能死了.

session的生命周期:

1.创建

2.活动:注意原有的回话还存在,这个旧的SessionId仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务端校验

3.销毁:session的销毁方式:

(1)调用了session.invalidate()方法

(2)Session过期(超时)

(3)服务器重新启动

Tomcat默认session超时时间为30分钟

设置session超时有两种方式:

1.session.setMaxInactiveInterval(时间;//单位是秒

2.在web.xml配置

<session-config>
<session-timeout>10<session-timeout>  //单位是分钟
</session-config>


application对象(类似于java se中的static类型)

application对象实现用户间数据共享,可存放全局变量。

application开始于服务器的启动,终止于服务器的关闭。

在用户的前后连接以及不同用户之间的连接中,可以对application对象的同一属性进行操作。

在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。

服务器的启动与关闭决定了application对象的生命。

application对象是ServletContext类的实例。

常用方法:

setAttribute(String name, Object value)使用指定名称将对象绑定到此会话。

getAttribute(String name)返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null。Enumeration getAttributeNames()返回所有可用属性名的枚举

String getServerInfo()返回JSP(SERVLET)引擎名及版本号

<%
application.setAttribute("city","北京");
application.setAttribute("postcode","10000");
application.setAttribute("email","lisi@126.com");
%>
所在城市是:<%=application.getAttribute("city")%><br>
application中的属性有:<%
Enumeration attributes=application.getAttributeNames();
while(attributes.hasMoreElements()){
out.println(attributes.nextElement()+"   "
%><br>


cookie对象

http协议的无状态性(服务器不会保存用户状态,不会记得客户端是否访问过)

什么是cookie?cookie:是web服务器保存在客户端的一系列文本信息。

典型应用一:判断注册用户是否已经登录网站。

典型应用二:保存用户浏览记录。

cookie的作用:

1、对特定对象的追踪。

2、保存用户网页浏览记录与习惯。

3、简化登录

安全风险:容易泄露用户信息

cookie是以文本文件形式保存在客户端的, 所以他的很多保存对象都是string类型

创建cookie对象

Cookie newCookie = new Cookie(String key,Object value);


写入cookie对象

response.addCoolie(newCookie);


读取cookie对象

Cookie[] cookies = request.getCookies();


session和cookie的区别:



page对象

page对象指向当前JSP页面本身,类似于类中的this指针,它是java.lang.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 notifyAll()唤醒所有等待的线程

void wait(int timeout) 是一个线程处于等待直到timeout结束或被唤醒

void wait()使一个线程处于等待直到被唤醒

pageContext对象

pageContext对象提供了对jsp页面内所有对象及名字空间的访问,可以访问到本页面所在的session,也可以取本页面所在的application的某一属性值。

pageContext对象相当于页面中所有功能的集大成者

pageContext对象的本类名也叫pageContext。

pageContext对象的常用方法:

1、jspWriter getOut()返回当前客户端响应被使用的jspWriter流(out)。

2、HttpSession getSession()返回当前页中的HttpSession对象(Session)。

3、Object getPage()返回当前页的Object对象(page)。

4、ServletRequest getRequest()返回当前页的ServletRequest对象(Request)。

5、ServletResponse getResponse()返回当前页的ServletResponse对像(Response)。

6、void setAttribute(String name,Object Attribute)设置属性及属性值

7、Object getAttribute(String name,int scope)在指定范围内去属性的值。

8、int getAttribute(String name)返回某属性的作用范围。

9、void forward(String relativeURLPath)是当前页重导到另一页面。

10、void include(String relativeURLPath)在当前位置包含另一文件。

<%
pageContext.forward("reg.jsp");//跳转到注册页面,URL地址栏不发生变化
%>


//日期必须要导入java.text.*这个包
<%@ page language="java" import="java.util.*,java.text.*" contentType="text/html;charset="utf-8"%>
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日");//将日期格式化
String s = sdf.format(date);
out.println(s+"<br>");
%>


Config对象

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

常用方法如下:

ServletContext getServletContext()返回含有服务器相关信息的ServletContext对象

String getInitParameter(String name)返回初始化参数的值

Enumeration getInitParameterNames()返回Servlet初始化所需所有参数的枚举

Exeception对象

概述:

(1)Exception是java.lang.Throwable类的实例

(2)当一个页面运行发生了异常,就产生了该Exception对象。

(3)若一个JSP页面要使用该Exception对象,需要将isErrorPage的值设为true。

Exception对象使用方法:

1、首先,需要在测试页面(抛出异常的页面)的首行page声明里,添加参数errorPage=”xxx.jsp”(含义为:当页面抛出异常,交给xxx.jsp来处理)

2、其次,需要在处理异常页面的首行page声明里,添加参数isErrorPage=true(含义为:异常处理的前提是测试页面抛出异常为真)

Exception对象常用方法:

(1)String getMessage() 返回描述异常的信息

(2)String toString() 返回关于异常的简短描述信息

(3)void printStackTrace() 显示异常及其栈轨迹

(4)Throwable FillInStackTrace() 重写异常的执行栈轨迹

Exception对象使用方法:

二、JavaBean

什么是Javabean?

Javabean就是符合某种特定规范Java类。使用Javabean的好处是解决代码重复编写,减少代码冗余,功能区分明确,提高了代码的维护性。

设计原则四点:

共有类(public)

属性私有(private)

包含无参的共有构造方法

geter和setter方法封装属性



什么是jsp动作?

JSP动作元素(action elements),动作元素为请求处理阶段提供信息。动作元素遵循XML的语法,有一个包含元素名的开始标签,可以有属性、可选的内容、与开始标签匹配的结束标签。

五类JSP动作元素:



在JSP页面中如何使用javabeans?

一、像使用普通java类一样

1、创建一个web project项目。

2、在src文件下,创建一个包,在包中创建一个类,满足设计原则即可

3、在index.jsp页面中通过import导入之前创建的类(import=”包名.类名”)

4、通过使用new创建Javabean实例(创建对象)

5、使用set方法赋值

6、使用get方法取值

示例如下。

javabean:

public class Users {
private String username;
private String password;
public Users(){}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}


index.jsp:

<body>
<%
Users user=new Users();
user.setUsername("Admin");
user.setPassword("666666");
%>
用户名:<%=user.getUsername() %><br>
密码:<%=user.getPassword() %>
</body>


二、在JSP页面中通常使用JSP动作标签来使用javabean

三个jsp动作标签:

useBeans

setProperty

getProperty

1.
<jsp:userBean>
动作标签:

<jsp:userBean id="标示符(就是创建的对象名)" class="指定类的完整包名" scope="作用范围(默认为page)" ></jsp:userBean>


作用:用来实例化一个对象,对象名由id指定,类由class指定。

2.
<jsp:setProperty>
动作标签:

作用:给已经实例化的Javabean对象的属性赋值,一共有四种形式

1)
<jsp:setProperty name="JavaBean实例名" property="*" />
(跟表单关联)

说明:JavaBean实例名 即 useBean 的 id;* 表示对所有的属性进行匹配

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对象中的参数名" />
(跟request参数关联)

3.
<jsp:getProperty>
标签的使用

作用:获取指定JavaBean对象的属性值。

<jsp:getproperty name="JavaBean实例名" property="属性名"/>


Javabean四个作用域范围(scope):

page仅在当前页面有效,最小范围

request可以通过HtppRequest.getAttribute()方法取得JavaBean对象,相当于把Javabean对象当作request对象的属性了。

session可以通过HttpSession.getAttribute()方法取得Javabean对象,相当于把Javabean对象当作session对象的的属性了。

application可以通过application.getAttribute()方法取得Javabean对象,相当于把Javabean对象当作application对象的属性了,同时作用域范围是最大的。

超链接相当于一次请求重定向(相当于发了一次新的请求),request对象失效,但仍属于同一会话,session对象有效。使用服务器内部转发则属于同一请求,此时request对象有效。

request.getRequestDispatcher("testScope.jsp").forward(request,response);


三、Model1

Model1:jsp+javabean,其中jsp为表示层和控制层,javabean为模式层。

Model1分为三层:

1.界面层:由JSP页面进行与客户端浏览器的交互,可以直接调用JavaBeans。

2.业务逻辑层:由JavaBeans进行处理业务逻辑,封装数据,并与数据库层进行交互。

3.数据库层:底层数据库,可被JavaBeans访问。

注意:

1、Model 1模型出现前,整个Web应用的情况:几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应。

2、弊端:在页面层充斥着大量的业务逻辑代码和数据访问层代码,Web程序的可扩展性和可维护性非常差。

3、Javabean的出现可以使jsp页面中使用Javabean封装的数据或者调用Javabean的业务逻辑代码,这样大大提升了程序的可维护性。

Ps:Javabean既可以封装数据同时也可以封装业务逻辑。



javabean的设计原则:私有的属性,公有的类。

四、三个指令和三个动作标签

指令

1.常用的三种指令:page,include,taglib。

2.page:位于页面顶端,一个页面可以包含多个page指令

include:将一个外部文件嵌入jsp中,同时解析这个页面中的jsp语句。

taglib:使用标签库,自定义新的标签,在jsp中启动定制行为。

3.include指令

1.语法 <% include file=”地址”%>。

案例:显示当前时间的页面。(1)写一个只输出时间的方法的date.jsp。(2)用于显示的页面,包含<% include file=”date.jsp”%>

cookie是服务器保存在客户端的一系列的文本信息,主要的应用是,记录用户的登录信息,以方便用户下次登陆,实现购物车。cookie中常用的方法有setMaxAge(时间)设置生存期限,setName(string name)

设置cookie的名字,setValue(string value)设置cookie的值,getName()获取cookie的名字,getValue()获取cookie的值,是string类型的,getMaxage()获得生存期限,创建cookie对象用Cookie c=new Cookie(string key,object value);添加cookie对象用response.addCookie(c);request.getCookies()获取cookie的值,注意是一个cookie数组,要获取每个值还要遍历,获取复选框的值用request.getParameterValues()得到的是一个字符串数组,如果用户选了保存,则讲cookie保存,如果没有保存则将相应的值删除。如果想在cookie中保存汉字的话要用到一个方法,在java.net.*下,存的时候要进行编码用URLEncoder.encoder(string s,”utf-8”),读数据的时候要进行解码用UrlDecoder.decode(string s,”utf-8”),cookie中存的信息是有大小限制的。

include动作

<jsp:include page="URL" flush="true|false" />


page:包含的页面

flush:被包含的页面时否从缓冲区读取

include指令与include动作比较:



forward动作

语法:

<jsp:forward page="URL" />


等同于服务器转发:

request.getRequestDispatcher("/url").forward(request,response);


param动作

param动作,传递方法为post

1、语法:
<jsp:param name="参数名" value="参数值">


2、【常常与
<jsp:forward></jsp:forward>
一起使用】,并作为其【子标签】。

3、用于传递新参数或者【修改原有参数值】,修改参数时使用form表单里的参数名称即可。同样用request.getParameter(“参数名”)获取

必须与forward、include及plugin动作配合使用。通常与forward动作一起使用,作为它的子标签,它的作用是指定某个参数值,可以用于传递参数,

<jsp:forward page="url">
<jsp:param name="参数名" value="参数值"/>
</jsp:forward>


1 .页面内容经常变化时(需要经常编译)更适合使用
<jsp:include>
动作

2 .页面内容不经常变化时更适合使用include指令

以上结论根据inlude指令的编译慢执行快和include动作的编译快执行慢可得出。

另外:
<jsp:include>
动作在页面请求期间被执行,而include指令在页面编译期间被执行。

include指令是将源文件与include添加的文件一起编译成一个servlet文件,如果include添加的文件经常发生变化,那么每次都需要编译,同时原来页面的代码也需要一起编译,这样效率不高,如果此时使用include动作的话,只需要编译include添加进来的文件,原来页面的代码是不需要再次编译的,这样开销会小一点。我是这么理解的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jsp session