jsp基础知识小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ParanoidYang/article/details/70768256

一、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()。
提交表单解决中文乱码问题:

扫描二维码关注公众号,回复: 3859939 查看本文章
<%
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","[email protected]");
%>
所在城市是:<%=application.getAttribute("city")%><br>
application中的属性有:<%
    Enumeration attributes=application.getAttributeNames();
    while(attributes.hasMoreElements()){
        out.println(attributes.nextElement()+"&nbsp;&nbsp;&nbsp;"
%><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添加进来的文件,原来页面的代码是不需要再次编译的,这样开销会小一点。我是这么理解的。

猜你喜欢

转载自blog.csdn.net/ParanoidYang/article/details/70768256