jsp入门讲解笔记

JSP
1.什么是JSP
Java Server Page(Java服务器端页面技术),是sun公司制定的一种服务器端动态页面
技术规范。
因为Servlet生成页面,如果页面比较复杂,则Servlet代码比较繁琐,并且不容易维护。
所以相对比较复杂的页面用JSP,相对比较容易维护和编写。
2.如何写一个JSP文件
创建一个以.jsp为后缀的文件。然后在该文件中添加HTML和java代码段,编写完成以后
不需要再编译,当访问该jsp文件时,服务器会将该jsp文件转换成一个.java文件(
其实就是一个Servlet)
3.JSP的组成
(1)HTML(CSS javascript)
直接写在jsp文件中
(2)java代码
第一种形式;java代码段
<% java代码%>
第二种形式:jsp表达式
<%= %>
第三种形式:声明表达式
<%! %>
(3)JSP 指令
所谓jsp指令就是告诉jsp引擎(在容器中,将把jsp转换成jsp文件时,并在运行时,
为jsp提供的一些辅助模块)
在将.jsp文件转换成.java文件时做一些额外额处理。
语法:<%@ 指令 属性名=属性值%>

page指令
import属性 用于导包
比如<%@ page import="java.util.*"%>
contentType属性
相当于response.setContentType("");
pageEncoding属性
告诉jsp引擎jsp文件保存时的编码
session属性 值是true(缺省)/false,当设置为false时,生成对应的servlet代码中将不会
声明和创建session对象,即jsp页面中不能使用session内置对象

errorPage属性 指定该页面出错时,跳转的错误处理页面。

isErrorPage属性值是true(缺省)/false,当前jsp是否作为一个错误处理页面
当设置为true时,就作为错误处理页面

isELIgnored属性值是true(缺省)/false,是否忽略EL表达式,为true时则忽略。
 

include指令
<%@ include file="jsp01.jsp" %>

taglib指令
uri是标签的命名空间
prefix是标签的命名前缀
<%@ taglib prefix="" uri="" %>

(4)隐含对象
所谓隐含对象,就是在jsp文件中不用声明和创建就可以使用的对象,因为.jsp文件
相当于.java文件,自动生成了隐含对象的代码。
out
request
response
session
application
pagecontext
exception
config
page
访问范围从小到大
pageContext(只有对应的jsp实例自己才可以访问,生命周期是该jsp对象创建到该jsp对象
销毁)
-》 request(一次请求能访问,生命周期在访问和响应之间)
-》 session(一次回话之间能访问,生命周期是多次请求和响应之间)
-》ServletContext 整个应用内部的组件都能访问,除非服务器关闭,否则一直存在。

config是ServletConfig的一个实例,可以获取初始化参数。
pageContext
是PageContext的实例,服务器会为每一个jsp实例(即对应的那个servlet实例)
创建一个唯一的PageContext实例。
主要对象有两个
1)可以getAttribute(),setAttribute(),removeAttribute()
2)可以获得其他八个内置对象
exception
当页面中设置<%@ page isErrorPage=“true”%>,可以通过该内置对象获取
错误信息。


e.活动元素
1)<jsp:forward page="jsp08.jsp"></jsp:forward>
转发,page属性指定转发的地址
2)
 <jsp:include page="jsp10.jsp">
    <jsp:param value="zhangsan" name="add"/>
    </jsp:include>
在一个jsp页面中调用另一个jsp页面
并且可以向另外一个jsp页面通过<%=request.getParameter("add") %>传递参数
3) <jsp:useBean id="user" scope="request" class="bean.User"></jsp:useBean>
在指定的范围内绑定一个对象。
范围是:pageContext、request、session、ServletContext
其对应的值是page,request,session,application
4)
<jsp:setProperty name="user" property="name"  value="zhangsan"/>
 <jsp:setProperty property="age" name="user" param="aa"/>
根据请求参数给属性赋值
<jsp:setProperty property="*" name="user"/>
根据自省机制给属性赋值
f.jsp中的注释
<!-- -->
这种注释中有java代码段会执行,但是不会显示。
第二种注释
<%-- --%>
这种注释不会执行,也不会显示
g.jsp如何转换成.java文件
html-》放在service方法中,用out.write()输出
<%%>-》照搬到service方法中
<%= %>->会在service方法中用out.println()输出
指令-》会影响源代码的生成,不如导包
<%! %> 如果在jsp中声明的变量会变成servlet中的属性,
定义的方法会生成的servlet中创建一个方法。


转发:(地址栏不变)
一个web组件(jsp或者Servlet)将未完成的处理交给另一个web组件处理。
这几个web组件可以共享同一个request和response对象。

request.getRequestDispatcher("emplist.jsp").forward(request, response);
如何转发:
(1)先绑定数据
request.setAttribute(String name, Object obj);
与绑定数据相关的方法
Object data=request.getAttribute(String name);
request.removeAttribute(String name)
(2)转发
获得转发器
RequestDispatcher rd=request.getRequestDispather("list.jsp");
转发rd.forward(request,response);
编程注意的问题
转发之前不能做out.colse()和out.flush()操作
转发之前会把response缓存中的数据清空
转发的特点:
转发只能是同一个应用之间的组件转发。
转发以后地址不变
转发的组件共享request和response对象。
3.JSP表单中的中文问题处理
在JSP添加如下指令:
<%@ page pageEncoding="utf-8" contentType="text/html;charset=utf-8"%>
设置表单提交方式为post
在Servlet中
request.setCharacterEncoding("utf-8");
如果要访问数据库
对于mysql数据库
create database db default character set utf-8;
在访问数据库时,设置其可以保存中文
jdbc:mysql://localhost:3306/test?useUnicode=true&CharacterEncoding=utf-8;

4.路径问题:
jsp中路径应该如何写
路径问题:
1.<form action="">表单提交
2.<a href="">链接
3.response.sendRedirect("")重定向
4.request.getRequestDispatcher("")转发(从工程名字后面开始)
相对路径和绝对路径
相对路径:不以/开头的路径成为相对路径,比如
<a href="del.do"></a>
绝对路径:以/开头的路径成为相对路径,比如
<a href="/appname/del.do"></a>

建议:一般在开发中尽量使用绝对路径。
如果要用绝对路径
链接 表单提交 重定向 要从应用名开始写
转发从应用名后开始写

----------------------------------------------------------------------------------------------

路径问题:
1.<form action="">表单提交
2.<a href="">链接
3.response.sendRedirect("")重定向
4.request.getRequestDispatcher("")转发(从工程名字后面开始)
____________________________________________________________________
写相对路径要看相对谁来说的
写绝对路径要从工程名字开始
href="/servle/day01/test1.jsp"
____________________________________________________________________

动态获取工程名字
String request.getContextPath

href="<%request.getContextPath%>/test"

不用javascript
登陆成功跳转list,不成功继续留在登陆页面
user表
username    用户名
name    真实姓名
pwd    密码
sex    性别
number    验证码
create table user(
id int primary key auto_increment,
name varchar(50),
pwd varchar(50));
---------------------------------------------------------------------------------------------------
Http状态管理
(1)什么是状态管理
一般是客户端(浏览器)和服务器之间的多次交互当做一个整体看待
,即把多次交互过程中所涉及的数据记录下来。
(2)怎样进行状态管理
第一种:通过客户端Cookie技术
第二种服务器端Session技术
(3)Cookie技术
1)什么是cookie
浏览器访问服务器时,服务器会将一些数据以set_cookie的消息头发送给浏览器,
浏览器会将这些数据保存起来,当浏览器再次访问服务器时,浏览器会将这些
数据以Cookie消息头发送给服务器,通过这种方式可以管理用户的状态。
2)如何创建Cookie
Cookie c=new Cookie(String name,String)
response.addCookie(c);
3)查询Cookie
如果没有Cookie,返回null
Cookie cs=request.getCookies();
String name=cs.getName();
String value=cs.getValue();
4)Cookie保存的编码问题
Cookie的只能保存ascii字符,如果Cookie的值是中文,需要转换成ascii字符形式
可以使用URLEncoder.encode(),URLDncoder.dncode()这个方法转换成该形式
5)Cookie保存时间
cookie.setMaxAge(int second);
当second>0浏览器会将Cookie以文件形式保存在电脑中,当时间结束以后,
会删除该文件。
当second=0 会立即删除该Cookie
当second<0会将Cookie 保存在内存中,当浏览器关闭以后才会删除该Cookie
6)删除Cookie
第一种:Cookie cookie=new Cookie("name","");
第二种:Cookie.setMaxAge(0);
7)Cookie的路径问题、当浏览器向服务器的某个地址发送请求时,回去检查Cookie
的路径是否匹配,只有匹配才会发送Cookie。
可以通过Cookie.setPath("/url")设置cookie的保存路径
如果不设置cookie的保存路径,则是缺省的地址,是与保存cookie的web组件的地址
是一致。
比如:
通过/appname/addcookie保存的cookie,其地址是/appname/addcookie
规则:只有cookie的路径是访问服务器地址的上层目录或者和访问的地址一样,
才会发送cookie。
一般保存的cookie通过cookie.setPath("/appname/addcookie");
就可以发送所有的cookie
8)cookie的限制
cookie可以禁止
cookie的大小有限制(4k左右)
cookie的数量也有限制(浏览器一般只保存300个左右的cookie)
cookie只能保存ascii编码
cookie不安全
————————————————————————
写一个
cookieUtil类
两个方法
保存,查看cookie的方法,不需要继承

————————————————————————

Cookie可以查看同一目录或父目录的信息。
(4)Session
1)什么是session
当浏览器访问服务器时,服务器会创建一个session对象,该对象有唯一的
id,即sessionId,服务器会通过cookie机制将该sessionId发送给浏览器。当浏
览器再次向服务器发送请求时,会携带该sessionId,服务器通过该sessionId
找到session对象,实现一种状态管理技术。
(session保存在内存中)
-----------------------------------------------------------------

设置返回数据类型
创建图片对象
获得画笔对象
设置画笔颜色
填充图片的背景颜色
再次设置画笔颜色
生成图片上演示的字符串
将字符串画到图片上
获得图片输出的流 因为保存图片的数据是字节数组,
所以不能用PrintWriter
将图片压缩输出

传参数是时才会转发

通过cookie保存

过滤器配置一定要写在servlet之前
—————————————————————————-------------          
2)如何获取session对象
获取session可以通过两种方式
第一种方式:
HttpSession session=request.getSession(boolean flag)
当flag为true时,当浏览器将sessionId传送给服务器时,会先找该sessionId,
如果不存在,则创建一个session对象,如果存在则根据sessionId去找该
session对象,如果找到,则返回session对象,如果找不到则创建一个session对象。

当flag为false时,当浏览器将sessionId传送给服务器时,会先找该sessionId,
如果找到,则返回session对象,找不到则返回null。
第二种方式
HttpSession session=request.getSession()
相当于flag为true。
3)HttpSession接口提供的一些方法
(1)session.getId();获取sessionId
(2)绑定数据
session.setAttributte(String name,Object obj)
服务器在对session进行持久化操作时,会执行激活等操作,所以建议obj一般
实现序列化接口。
Object data=session.getAttribbute(String name);
如果找不到则返回null
session.removeAttribute(String name);

服务器在对session进行持久化操作时,obj为什么要实现序列化接口?
因为服务器中一般会保存很多的session对象,里面保存了用户的状态
数据(比如购物信息),但是内存有限,对于海量的信息,这些session对象是
不够用的。

一般情况下 , 我们配置好数据库(或者以文件的形式保存在磁盘上),
这样就可以让某个用户将数据保存在数据库或者磁盘上,使该session
处于空闲。

session应用案例:
1.验证码
2.购物车
完善购物车,当用户关闭浏览器,打开浏览器,购物车的商品条目
还在(通过Cookie完成)

重写

当用户禁止Cookie, 如何使用session机制?
1)解决方式
通过URL重写
2)什么是重写
如果要访问web组件(jsp或servlet),不能直接在地址栏输入要访问的地址,
而是应该使用服务器生成包含有sessionId的地址。
3)如何生成包含有sessionId的地址?
方式一(适用于链接和表单提交)
response.encodeURL("session");
方式二(适用于重定向)
resp.encodeRedirectURL("url");

转发不用

过滤器
1)什么是过滤器
在servlet规范中定义的一种特殊的类,用于对servlet调用过程中的一些拦截。
2)如何写一个过滤器
定义java类实现Filter接口
在doFilter方法中实现过滤业务。
在web.xml中配置过滤器
3)配置初始化参数
可以在web.xml中使用<init-para>配置一些参数,在filter中可以使用FilterConfig.getInitParameter(String name)
的方法获取获取该参数值

4)当多个过滤器满足过滤条件时会根据在web.xml中配置的<filter-mapping>先后顺序执行。

5)过滤器的优点
可以使过个servlet的过滤业务写在一个过滤器中,方便代码的维护
可以实现代码的可插拔性
给一个软件增加或者删除一个功能,不会影响已经存在的功能。

监听器
1)什么是监听器
servlet规范中定义的一种特殊的类,作用是对servlet容器中产生的一些事件进行监听,
并处理。
2)容器中的时间主要分为两大类?
第一类:
生命周期事件,即容器在创建 request session  ServletContext对象时,或者销毁时产生的
事件。

第二类
绑定数据事件,当request session  ServletContext数据执行setAttribute(),removeAttribute()
产生的事件
2)如何写一个监听器
创建一个java类实现相应的接口(根据事件类型)
在接口方法中实现监听逻辑


监听器配置在过滤器之前

JSTL和EL表达式


































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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值