Jsp的基本原理
1.jsp页面部分包括两部分:
静态部分:标准的html标签、静态的页面内容,这些与静态的html相同。
动态部分:受java程序控制的内容,这些内容由java程序来动态生成。
2.Jsp页面的本质是一样的,它编译后生成servlet,它的特点是在html中加入java代码。
3.jsp经过编译后生成的.class和.java文件都存在于tomcat的work\catalina\localhost\.....目录下
4.JSP注释:
<%-- 注释不会被发到客户端--%>
5.JSP的声明
<%! %>JSP的声明部分将转换成servlet的成员变量或者成员方法。
6.输出JSP表达式
<%=表达式%> 输出表达式语法后不能有分号。
7.JSP的三个编译指令
7.1 page是针对当前的页面的指令。
include用于指定包含另一个页面。
taglib用于定义和访问自定义标签。
? 编译指令的格式:
<%@编译指令名 属性名=“属性值”…………%>
?<%@page language="text/html"%>
?<% @include file="script.jsp"%>
这个是静态的include指令,它会把其它页面的编译指令也包含进来,但若两个页面的编译指令冲突就会报错。动态的include指令则不会。
8.jsp的7个动作指令
动作指令与编译指令不同,编译指令是通过servlet引擎处理消息,而动作指令只是运行时的动作。
编译指令在将JSP编译成servlet时起作用,处理指令通常可替代成JSP脚本,它只是JSP脚本的标准化写法。
?JSP:forward:执行页面跳转,将请求的处理转发到下一个页面;
语法:①<JSP:forward page="{relativeURL|<%=expression%>}"/>(JSP1.0版本)
②<JSP:forward page="{relativeURL|<%=expression%>}">
{<JSP:param.../>}
</JSP:forward>
第二种方法用于转发时增加额外的请求参数,增加的请求参数可以通过httpservletRequest类的getParameter()方法获取。
例子:
第一个页面forward.jsp页面
<body>
<title>forward的原始页面</title>
<jsp:forward page="forward_result.jsp">
<jsp:param name="age" value="29"/>
</jsp:forward>
forwardd_result.jsp页面使用request的内置对象httpservletRequest类的getParameter()方法来获得请求参数的值。
<body>
<title>结果页</title>
<%=request.getParameter("age")%>
</body>
执行forward指令时,用户请求的地址依然没有发生变化。执行forward指令时,若有表单,则表单中的参数也不会丢失。
(它的请求只是一次)
?JSP: param: 用于传递参数,必须与其他支持参数的标签一起使用;
该标签单独使用没有意义,可以与include forward plugin一起使用。
?JSP: include:用于引入一个JSP页面;
include指令是一个动态指令,也用于包含某个页面,它不会导入被include页面的编译指令,仅仅导入页面body内容插入本页面。
语法:<jsp:includepage="{relativeURL|<%=expression%>}" flush="true"
>
或者<jsp:include page="{relativeURL|<%=expression%>}"
flush="true" >
<jsp:param name="parameterName" value="parameterName"/>
</jsp:include>
flush用于指定输出缓存是否被转移到被导入文件中
动态和静态的区别:
①静态导入是将被导入的页面的代码完全融入,两个页面完全融合成一个整体servlet,而动态导入则在servlet中使用include
方法引入被导入页面的内容。
②静态导入被导入的页面的编译指令会起作用,动态则不会,只是导入被导入页面的body内容。
③动态包含还可以增加额外的参数。
forward指令和include指令的区别:
他们调用的方法不同;被forward的页面完全取代原来的页面,而被include的页面只是插入原有的页面。
?JSP:plugin:用于下载JAVABean或Applet到客户端执行;(一般使用支持applet的HTML标签,所以一般不用此标签)
?JSP:useBean:创建一个JavaBean的实例;
?JSP:setProperty:设置javaBean实例的属性值;
?JSP:getProperty:输出JavaBean实例的属性值;
useBean作用于JSP页面中初始化一个java实例;如果多个页面需要重复使用某段代码,我们可以把这段代码设置成Java类的方法,
然后让多个页面调用这个方法
语法:
<jsp:userBean id="name" class="classname" scope=" page|request|session|application">
id表示实例名字,class确定javaBean的实现类,scope用于指定JavaBean的作用范围其中page表示该实例在该页面有效;
request表示该实例在本次请求中有效,session表示该请求在本次session有效;application表示该JavaBean在本次应用内一直有效。
例子:
<body>
<jsp:userBean id="p1" class="lee.Person" scope="page"/>
<jsp:setProperty name="p1" property="name" value="wawa"/ >
<jsp: getProperty name="p1" property="name">
</body>
说明:其实以上的三个指令可以不使用,换成修改成以下代码:
<body>
<% Person p1=new Person();
//把p1放到page范围内
pageContext.setAtrribute("p1",p1);
//或者放入session范围内
session.setAtrribute("p1",p1);
//或者放入request范围内
request.setAtrribute("p1",p1);
//或者放入application范围内
application.setAtrribute("p1",p1);
p1.setName("wawa");
%>
<% =p1.getName() %>
</body>
9.jsp的9个内置对象
这9个内置对象是Servlet API接口的实例,知识JSP规范对其进行了默认的初始化,可以直接使用。
application:代表JSP所属的Web应用本身,可应用于JSP页面或者在servlet之间交换信息。
浏览器作用:向远程服务器发送请求;读取远程服务器返回的字符串数据;负责根据字符串数据渲染出一个丰富多彩的页面。
JSP中的application、session、request、pagecontext这4个内置对象分别作用于application、session、request、page范围中的数据。
application对象的作用:在 整个web应用的多个JSP、servlet之间共享数据。访问Web应用的参数配置。
config:代表该JSP的配置信息。
由于JSP页面通常无需配置,所以用不到,通常用在Servlet中。
exception:代表其它页面的异常或者错误,当该页面的isErrorPage属性为true时,该对象才可以使用。
out:代表JSP页面的输出流,用于输出内容形成HTML页面。
page:代表页面本身,也就是servlet中的this
pageContext:该对象表示JSP页面上下文,使用该对象可以访问页面中的共享数据。
request:封装了一次请求,客户端的请求参数都被封装在该对象中。(获取请求头和请求参数;操作request范围内的属性;执行forward或include)
request对象是Jsp中重要的对象,每个request封装这一次用户请求,该次请求的所有参数都封装在该对象中。
Get和Post请求方式的区别:
get:直接在浏览器地址栏输入访问发送的访问请求霍是提交表单发送请求时,该表单对应的form元素没有设置method属性,或者设置设置为get,这几种请求方式都是get请求。get方式的请求会将请求 参数的名和值转换成字符串,并附加在原地址后,因此在地址栏中可以看到请求参数名和值。且传输的数据量较少。(get方式发送的请求参数被附加到地址栏之后的形式:url?age=11&name=“Jone”;)设置编码方式比较复杂主要用到:URLDecoder和URLEcoder两个方法。也可以先将其转化成字节数组,然后将字节数组重新解码成字符串。
post:这种方式通常使用表单提交(由form html组成)的方式发送,且需要将form元素的method属性设置为post。post请求传输的数据量比较大,而且Post方式发送的请求参数以及对应的值放在HTML header中传输,用户不能在地址栏中看到请求参数,安全性相对较高。设置编码request.setCharacterEncoding(“gb2312”);
提示:
并不是每个表单域都会生成请求参数的,而是有name属性的表单域才会生成请求参数。
每个有name属性的表单域对应一个请求参数。
如果多个表单域有相同的name属性,则多个表单域只生成一个请求参数,只是该参数有多个值。
表单域的name属性指定请求参数名,value指定请求参数值。
如果某个表单域设置了disabled=“disabled”属性,则该表单不在生成请求参数。
执行forward或include:
例子:getRequestDispatcher(“/a.jsp”).include(request,response);
getRequestDispatcher(“/a.jsp”).forward(request,response);
response:代表服务器对客户端的响应,通常很少直接使用该对象直接响应,而是使用out对象,获取客户端请求必须使用该对象。
响应生成字符流一般都使用out,但生成非字符的的内容是只能使用response对象
respose.sendRedirect("***.jsp");(执行redirect生成的第二次请求。不保留原请求的请求参数。地址栏改为重定向的目标URL。)
增加Cookie
<%
String name=request.getParameter("name");
Cookie c=new Cookie("username",name);
c.setMaxAge(24*3600);
response.addCookie(c);
%>
使用request对象访问浏览器的cookie
<% Cookie[] cookies=request.getCookies();
for(Cookie c: cookies){
if(c.getName().equals("username")){
out.println(c.getValue());
}
}
%>
session:该对象代表一次会话,浏览器连接服务器表示会话开始。当客户端关闭浏览器时,会话结束。
通常该对象用于跟踪用户的会话信息,如 判断用户是否登陆系统,用于跟踪用户购买的商品。
session范围内的属性可以在多个页面的跳转之间进行共享。关闭浏览器属性消失。
注意:
session的属性值是任何可序列化的java对象。
版权声明:本文为博主原创文章,未经博主允许不得转载。