`
songzhan
  • 浏览: 238879 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

selevet、jsp

 
阅读更多
day011、什么是Servlet?
sun公司制订的一种用于扩展web服务器功能的
组件规范。
1)扩展web服务器功能
web服务器功能:
早期的web服务器(apache,iis)只能够处理
对静态资源的请求,不能够处理动态资源的
请求(所谓动态资源,指的是,需要服务器进行
计算,依据计算结果,生成相应的数据)。
可以使用以下两种方式来扩展其功能(
即让web服务器可以处理动态资源的请求)
第一种方式: 使用CGI程序
(Common Gateway Interface),可以使用perl,
c等语言来开发。
因为使用CGI脚本来扩展web服务器功能有
两个问题比较麻烦:
"传参"问题,即CGI脚本程序需要直接去
解析web服务器传递过来的原始的请求数据。
"移植性"问题,因为perl,c等语言,与
平台相关。
第二种方式: 使用组件+容器
2)组件与容器
组件:
符合某种规范、实现特定的功能的程序模块,
组件需要部署到容器上才能运行。
容器:
符合某种规范、为组件提供运行环境,并且
提供相应的基础服务的程序。
Servlet是一种组件,用来实现相应的业务逻辑,
也就是说,有来处理用户的请求,并生成相应的
处理结果。Servlet作为一个组件,不需要处理
一些比较基础的问题(比如,网络通讯问题、参数
传递的问题,因为这些问题都由Servlet容器,
比如tomcat去解决)。
相比于cgi程序,有两点优势:
a, 开发简单方便(不需要去分析请求数据)。
b, 可移植性好(比如开发好了一个Servlet,
可以在任意的符合相应规范的容器上运行,
比如tomcat,weblogic,websphere...)。
3)规范
jcp组织成员(sun,ibm)提出一个jsr请求文档
成员投票通过,就成为了规范。
2、如何开发一个Servlet?
step1 写一个java类,实现Servlet接口或者
继承HttpServlet抽象类。
step2 编译
step3 打包
appname
WEB-INF
classes
*.class
lib(可选)
*.jar
web.xml(部署描述文件,包含有servlet-url)
可以将整个文件夹使用jar命令打成一个.war的
文件,方便部署。
step4 部署
将step3创建好的文件夹或者.war文件拷贝到
web服务器(容器)特定的文件夹下面。
step5 启动服务器,访问Servlet。
http://ip:port/appname/servlet-url
3、tomcat的安装与使用
1)安装
step1 将tomcat.zip解压到 /home/soft01下面。
step2 配置环境变量
cd /home/soft01
vi .bash_profile
添加如下环境变量
JAVA_HOME
2)启动
cd /home/soft01/tomcat5/bin
sh startup.sh (unix/linux)
//sh catalina.sh run
startup.bat(windows)
访问 http://localhost:8080
3)关闭
cd /home/soft01/tomcat5/bin

sh shutdown.sh(unix/linux)
shutdown.bat(windows)
访问 http://localhost:8080
4) tomcat的几个主要的文件夹(了解)
bin : 可执行的脚本
common: 被部署在该服务器上的所有程序共享的
一些jar文件。
conf: 服务器相关的一些配置文件
webapps: 部署文件夹(将开发好的.war文件或者
整个应用程序可以拷贝到这儿)。
work:服务器运行时生成的一些临时文件。

  http://192.168.172.112:8080/firstweb/sayHello
4、Servlet是如何运行的
比如,向浏览器地址栏输入:
http://ip:port/firstweb/sayHello
step1 浏览器依据ip,port与服务器建立连接
step2 浏览器依据http协议,将请求相关数据
(比如,请求参数、请求资源路径)打成一个
http请求数据包发送给服务器。
step3 服务器收到请求数据包之后,创建两个
对象,request对象(请求对象,该对象是
HttpServletRequest接口的实现类的实例。
该对象中,包含了请求数据包中的数据,方便
Servlet从中读取数据) ;response对象(响应
对象,该对象是HttpServletResponse接口实现类的
实例,方便Servlet将处理结果写入)。
step4 服务器依据请求资源路径(/firstweb/sayHello)
找到对应的Servlet然后创建其实例。接下来,
调用Servlet实例的service方法(在调用时,会将事先
创建好的request,response对象作为参数传进来)。
Servlet可以通过request获取请求参数,也可以将处理
结果写入response。
step5 服务器从response对象中读取处理结果,依据
http协议生成http响应数据包,发送给浏览器。

5、使用myeclipse开发servlet
step1 让myeclipse管理tomcat
step2 建一个web工程

6、常见错误
1)404 (状态码,表示依据请求资源路径
找不到对应的资源)。
a,访问地址写错:
http://localhost:8080/web01/sayHello?name=zs
如果发生错误,检查访问地址
http://ip:port/appname/servlet-url
2)500(状态码,表示系统出错)
a,web.xml配置文件写错
b,Servlet类本身写错
3) 405(状态码)
检查service方法的签名(包括方法名、返回类型
参数类型 异常)。


作用:
写一个BMIServlte,用于计算bmi指数。
计算规则:
体质指数(BMI)=体重(kg)/身高(m)/ 身高(m)   
EX:70kg/1.75/1.75=22.86
成人的BMI数值   
体重指数, 男性, 女性   
过轻, 低于20, 低于19   
适中, 20-25, 19-24   
过重, 25-30, 24-29   
肥胖, 30-35, 29-34   
非常肥胖, 高于35, 高于34
http://ip:port/web01_home/bmi
?weigth=60&height=1.8&gender=m
会输出:
你的bmi指数是36,你非常肥胖。
web应用程序本质是讲是一种标准化了的
c/s架构应用程序。即
a,协议标准化(浏览器与
服务器之间使用标准的http协议)
b,客户端标准化(不需要单独去安装
某种客户端,使用浏览器即可)
c,服务器端标准化(只需要在现有的
web服务器上面,使用某种组件技术,
比如servlt编写业务逻辑即可)   



day021、http协议(了解)
1)什么是http协议?
(hyper text  tranfer protocol)超文本传输控制协议。
它定义了浏览器与web服务器之间数据传递的过程及
数据格式。
2)数据传递的过程
a,浏览器建立与web服务器之间的连接。
b,浏览器将请求打包,向web服务器发送请求。
c,web服务器将处理结果打包,发送给浏览器。
d,web服务器关闭连接。
浏览器每发送一次请求,就必须建立一次连接。
3)数据格式
请求数据包的格式
请求行: 请求方式(get/post) 请求资源路径 协议的类型及版本
若干消息头:
消息头由w3c定义,浏览器与服务器都会
遵守,比如 浏览器可以通过User-Agent消息头
告诉服务器浏览器的类型与版本。
实体内容:
只有当请求方式是post方式时,请求参数
才会添加到这儿,如果是get方式,请求参数
会添加到请求资源路径的后面。
响应数据包的格式
状态行: 协议的类型与版本 状态码 描述
状态码:
404:找不到对应的资源
500:系统出错
200: 正常
若干消息头:
比如,服务器可以发送content-type消息头,
告诉浏览器返回的数据类型及编码。
实体内容:
服务器返回给浏览器的处理结果。
2、get/post请求
1)哪一些是get请求
a,在浏览器地址栏直接输入一个地址
b,表单默认的提交方式
c,点击链接。
2)哪一些是post请求
a,表单设置了method="post"
3)两种方式的区别
a,get方式会将请求参数添加到请求行之后,
所以,发送数据量有限(大约是4k左右)。
而post方式会将请求参数添加到实体内容里
面,发送数据量理论上没有限制。
b,get方式会将请求参数显示在浏览器地址栏,
不安全。而post方式会将请求参数放在实体内容里,
相对安全。
get方式比较适合向服务器请求资源及提交少量的
数据。而post方式适合向服务器提交大量的数据。
3、表单的处理
1)如何获取表单中的数据
//  如果paramName对应的参数名不存在,返回null。
String request.getParameter(String paramName);
// 如果有多个参数名相同,
//比如 ?city=bj&city=wh&city=sh
String[] request.getParameterValues(String paramName);

对于单选框、多选框,如果用户不作任何选择,则
服务器端,获取的是null值。
2)表单中有中文参数值,
如何处理(采用post方式提交)
step1 在html文件当中,添加
<meta http-equiv="content-type"
content="text/html;charset=utf-8">
确保表单所在的页面以指定的编码来打开。
charset也可以设置为gbk,gb2312等支持
中文的编码。
step2 在Servlet类当中,添加
request.setCharacterEncoding("utf-8");
确保服务器以指定的编码对传递过来的参数
进行解码。
如果Servlet要向浏览器输出一些中文,还需要
添加
response.setContentType("text/html;charset=gbk");
确保输出时,使用指定的编码,另外,浏览器
也会以指定的编码来打开页面。

4、如何访问数据库(使用jdbc)
step1 添加数据库的jdbc驱动程序相关的jar包
添加WEB-INF\lib下。
step2 在Servlet类当中,使用jdbc代码。
要注意异常的处理。
系统异常如何处理:
a, 先记录日志
b, 将异常抛出(抛给容器)
throws new ServletException(e);
c, 写一个错误处理页面,页面的内容
:提示发生了系统错误,稍后重试。
d,在web.xml文件中,配置错误处理页面。
<error-page>
<error-code>500</errorcode>
<location>/error.html</location>
</error-page>

5、mysql的基本使用
step1 登录
mysql -uroot;
step2 常用操作
//查看所有的数据库实例
show databases;
//创建数据库实例
create database jd1112db
default character set utf8;
//使用某个数据库实例
use jd1112db;
//查看所有的表
show tables;
//建表
create table t_emp(
id bigint primary key auto_increment,
name varchar(20),
salary double,
age int
);
//插入记录
insert into t_emp(name,salary,age) 
values('zs',10000,24);
//查询
select * from t_emp;

create table t_user(
id bigint primary key auto_increment,
username varchcar(50) unique,
pwd varchar(8),
birthday date,
registime datetime,
gender char(1),
info text,
photo blob
);

练习:
写一个 ListEmpServlet,以表格的方式显示所有
雇员信息,包括id,姓名,薪水,年龄。

6、重定向
1)什么是重定向
服务器发送一个302状态码及一个Location
的消息头给浏览器,浏览器会立即向Location
所指定的地址发请求。
2)如何重定向
//url:指定重定向的地址。
response.sendRedirect(String url);



day031、重定向编程需要注意的问题
a, response.sendRedirect(String url);
url的值是任意的地址。
b,在重定向之前,会将response中缓存的数据清空。
如果重定向之前,执行了out.close()或者out.flush()
操作,会报错。

2、重定向的特点
1)重定向之后,浏览器的地址栏的地址会变成
Location消息头所指定的地址。
2)重定向的地址是任意的。

3、DAO
1)data access object(数据访问对象)。
封装了数据访问逻辑的一个模块。
这样做的好处是:
调用者(一般是业务逻辑模块)通过dao访问数据库,
不需要了解具体的数据访问细节。这样一来,当
数据访问实现发现了某种改变(比如,原来使用jdbc
访问数据库,现在改用hibernate,不需要修改业务
逻辑模块)。
2)如何写一个dao
a,实体类
实体类一般与表对应(表有哪些列,实体类一般
会对应有相应的属性,并且类型会匹配)。
Employee类
long id,
String name,
double salary,
int age
b,dao接口
声明了一系列的方法,这些方法应该与具体的
技术无关。
EmployeeDAO接口声明了:
public void save(Employee e) throws SQLException;//error
public void save(Employee e) throws Exception;//ok
c,dao实现类
使用具体的数据访问技术实现接口中声明的方法
EmployeeDAOImpl类
d, dao工厂类
工厂类:对调用者屏蔽了对象的制造过程,为
调用者提供符合接口要求的对象。

3、如何让一个Servlet处理多种不同的请求
1)容器如何处理请求资源路径
比如,在浏览器地址栏输入:
http://ip:port/appname/abc.html
浏览器会将"/appname/abc.html"作为请求资源路径
放在请求数据包里发送给容器(web服务器)。
step1 依据/appname找到应用(比如,去找
webapps下面的appname文件夹)
step2 将"/abc.html"作为请求资源,去web.xml
中去作匹配:
a,精确匹配:
比如,要求<url-pattern>也必须有一个"/abc.html"。
b,通配符匹配:
比如, <url-pattern>/abc/*</url-pattern>
"*"代表任意的字符串。
c,后缀匹配:
比如, <url-pattern>*.do</url-pattern>
表示任意的以.do结尾的请求。
step3 如果都不匹配,则不认为是一个servlet,
会查找.html文件,如果找到,则返回,找不到
返回404。
2)如何让一个Servlet处理多种请求
step1 web.xml中使用后缀匹配
step2 分析请求资源路径 day041、servlet的生命周期以及相关的
核心类与接口。
1)核心类与接口
a,Servlet接口
init(ServletConfig config):用于初始化,获得资源。
destroy():用于释放资源。
service(ServletRequest req,ServletResponse res):
b,ServletConfig接口
//访问servlet的初始化参数
String getInitParamter(String paraName);
初始化参数:
web.xml中,可以对某个servlet添加:
<init-param>
<param-name>company</param-name>
<param-value>tarena</param-value>
</init-param>
c,GenericServlet抽象类
实现了Servlet接口中的init,destroy方法。
d,HttpServlet抽象类
继承了GenericServlet,实现service()方法。
service(HttpServletRequest req,
HttpServletResponse res);
e,HttpServletRequest是ServletRequest的子接口
f,HttpServletResponse是ServletResponse的子接口
2)生命周期
容器如何去创建servlet对象,分配其资源,
调用其方法来处理请求,以及销毁servlet对象的
整个过程。
a,实例化:
情况一:当请求到达容器,容器创建某个
servlet对象(如果下次再有请求访问这个servlet,
不会再创建,也就是,某个servlet只会有一个
实例)。
情况二:容器启动的时候,会事先创建某个
servlet对象。容器启动时,会检查servlet的配置
如果有<load-on-startup>配置,就会创建其实例。
该配置必须是一个大于等于0的整数,越小,
优先级越高。
b,初始化:
容器在创建好servlet对象之后,会调用
init(ServletConfig config)方法。容器会事
先创建好ServletConfig对象。
GenericServlet已经提供了init方法的实现,
如果要提供自己的初始化逻辑,可以选择
override init()方法。
该方法只会执行一次。
c,就绪
容器调用service()方法来处理请求。
在写一个servlet的时候,可以选择
override service()方法或者override
doGet(),doPost()方法。
d, 销毁
容器会先调用destroy方法,然后销毁其
实例。
destroy()也可以override。
这个方法也只执行一次。


2、jsp
1)什么是jsp
java server page(java服务器端页面技术)
sun公司制订的一种服务器端动态页面生成的技术规范。
因为直接使用servlet生成动态页面过于繁琐,不
利于代码的维护(比如修改out.println生成的页面很
不方便),所以当需要生成动态页面时,使用
jsp会更方便。因为jsp的组成部分主要是html和少
量的java代码,如果是html,可以直接编写。
2)如何写一个jsp?
step1,写一个.jsp为后缀的文件
step2 ,在文件当中,添加:
a,html(html,css,js):直接写
b,java代码:
java代码片断: <%  java代码  %>
jsp表达式: <%=java表达式 %>
c, 隐含对象:
在.jsp文件当中,不用声明和创建就可以
使用的对象。因为容器在生成的servlet
源代码当中,会包含声明和创建隐含对象
的代码。
out
request
response
d,指令
容器在将.jsp文件转换成.java文件时,
要求容器做一些额外的处理。比如导包。
<%@ 指令名 属性=属性值%>
page指令:
import属性:导包
比如 <%@page import="java.util.*,java.text.*"%>
contentType属性:
会在对应的servlet代码当中添加
response.setContentType()语句。
pageEncoding属性:
告诉容器,.jsp源文件保存时的编码是什么。
3)jsp是如何执行的
step1 容器要将.jsp文件转换成一个
.java文件(其实质,就是一个servlet)。
html ----> 放到service方法里,使用
out.write输出。
out.write会将null转换成""输出。
java代码片断 --->放到service方法里,照搬。
jsp表达式 ---->放到service方法里,使用
out.print输出。
step2 容器调用servlet的service方法。

day051、转发
1)什么是转发?
一个web组件(servlet/jsp)将未完成的处理任务
通过容器转交给另外一个组件继续完成。
一般是一个servlet将处理之后得到的结果(也就是
一些数据)转发给一个jsp,由jsp使用这些结果来
生成相应的界面。
2)如何转发
step1 绑订数据到request对象上
request.setAttribute(String name,Object obj);
step2 获得转发器
//dest:转发的组件地址
RequestDispatcher rd =
request.getRequestDispatcher(String dest);
step3 转发
rd.forward(request,response);
//通过绑订名(name),获得绑订值。如果
//绑订值不存在,返回null。
Object request.getAttribute(String name);
//解除绑订。
request.removeAttribute(String name);
3)转发编程要注意的事项
a,转发的地址(dest)只能是同一个应用内部的组件的
地址。
b,转发之前,会将response中缓存的数据清空。
如果转发之前,调用了out.close(),out.flush(),会
出错。
4)转发的特点
a,转发的目的地只能是同一个应用内部的各
个组件。
b,转发之后,浏览器地址栏的地址是不变的。
c,转发的各个组件可以共享request,respose对象。
2、将中文数据保存到数据库
step1 要确保当前数据库保存的中文数据使用了
正确的编码。
对于mysql:
create database jd1112db default
character set utf8;
step2 使用jdbc驱动程序访问数据库时,需要让
jdbc驱动程序知道数据库保存中文时的编码。
jdbc:mysql://localhost:3306/jd1112db?
useUnicode=true&characterEncoding=utf8


day061、状态管理
1)什么是状态管理?
浏览器与服务器之间多次交互所涉及的数据。
对这些数据时行管理的过程称为状态管理。
比如:
用户通过浏览器在某个网上商城进行购物,
需要浏览器与网上商城进行多次交互,包括
多次的购买操作、修改商品数据、结账等等。
需要将这些操作所涉及的数据进行管理。
2)如何进行状态管理?
方式一: 在客户端保存用户的状态(cookie技术)
方式二:在服务器端保存用户的状态(session技术)
3)cookie
a,什么是cookie?
服务器发送给浏览器的少量的数据,这些数据
以set-cookie消息头的方式发送给浏览器,浏览器会
将这些数据保存下来,当浏览器下次访问服务器时,
会将这些数据以cookie消息头的方式发送给服务器。
通过这种方式,就可以维护用户的状态。
b,如何创建cookie?
Cookie c = new Cookie(String name,
String value);
response.addCookie(c);
c,查询cookie?
//该方法有可能返回null。
Cookie[] request.getCookies();
String cookie.getName();
String cookie.getValue();
d, 编码问题
cookie的值只能是ascii字符,如果是中文的话,
要将中文转换成对应的ascii表示方式。
//先将str按照code指定的编码格式进行编码,
//得到一个字节数组,然后再将该字节数组转换
//成一个ascii字符串。
String URLEncoder.encode(String str,
String code);
String URLDecoder.decode(String str,
String code);
e,生存时间
cookie.setMaxAge(int seconds);
seconds > 0:
浏览器会将cookie保存在硬盘上
(以文件的方式保存),当浏览器关闭,不会影响到
cookie,只要当指定的时间到达之后,浏览器
才会删除这个cookie。
seconds = 0:
删除cookie。
//比如,要删除一个叫username的cookie
Cookie c = new Cookie("username","");
c.setMaxAge(0);
response.addCookie(c);
seconds < 0:(默认值),浏览器会将cookie
保存在内存里面,浏览器关闭,cookie
被销毁。
f,cookie的路径问题
浏览器在访问服务器上的某个地址时,
会先比较cookie的地址(路径)与这个要访问的
地址,只有符合条件的cookie才会发送给
服务器。
cookie如果没有调用setPath方法,则cookie
会有一个默认的path属性值(即cookie的路径)。
这个默认值就是保存这个cookie的组件的地址。
比如: /web06/app1/addCookie.jsp生成了
一个cookie,则该cookie的路径就是
/web06/app1。
该路径可以修改: cookie.setPath(String path);
只有要访问的地址是cookie的路径或者是其
子路径,浏览器才会将这个cookie发送给服务器。
cookie.setPath("/appname");
练习:
写一个Find_Add_CookieServlet, 该servlet
先查询一个名叫company的cookie,如果存在,
则输出其值。如果不存在,则创建:
比如 Cookie c = new Cookie("company","tarena");
g,cookie的限制
cookie可以被禁止
cookie的值只能是字符串,并且需要考虑编码问题。
cookie保存的数据大小有限制(跟浏览器有关系,
大约4k),而且,保存的cookie的数量也有限制(
大约300个)。
cookie不安全。
4)session
a,什么是session?
浏览器在访问服务器时,服务器会创建一个
session对象(该对象有一个唯一的id号),接下来,
服务器在默认情况下以set-cookie消息头的方式
将该id号发送给浏览器;浏览器会将id保存在
内存里(因为该cookie没有指定生存时间)。当浏览器
再次访问服务器时,会将id号发送给服务器,
服务器通过id号可以找到之前创建的session对象。
b, 如何获得session对象。
方式一:
HttpSession s =
request.getSession(boolean flag);
当flag = true:
服务器检查请求中是否包含session id,
如果没有,则创建session对象;
如果有,服务器还要依据session id查找对应的
session对象,如果找到,则返回,找不到,
创建一个新的session对象。
当flag = false:
服务器检查请求中是否包含session id,
如果没有,返回null。
如果有,服务器还要依据session id查找对应的
session对象,如果找到,则返回,找不到,
返回null。
方式二:
HttpSession s =
request.getSession();
与request.getSession(true)相同。
c, 常用方法
String id = session.getId();
session.setAttribute(String name,Object obj);
Object session.getAttribute(String name);
session.removeAttribute(String name);
d,session超时
服务器有一个默认的超时限制,大约30分钟。
session对象创建好之后,空闲时间超过指定时间,
服务器会将session对象删除。
可以通过修改服务器的配置来更改:
tomcat可以改conf/web.xml
<session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    也可以相应修改WEB-INF\web.xml。
    session.setMaxInactiveInterval(int seconds);
    e,删除session
    session.invalidate();
5)案例
a, session验证
step1 在登录成功之后,执行:
session.setAttribute("user",user);
step2 对于需要保护的资源(只有登录之后,才
能访问的地址),执行:
Object obj = session.getAttribute("user");
if(obj == null){
//没有登录,重定向到登录页面
response.sendRedirect("login.jsp");
}else{
//可以访问
}

练习一:
登录模块添加session验证。
练习二:
写一个“留言板"。 day071、验证码

练习:
注册页面添加验证码

http://localhost:8080/shoppingcart/list.do
2、购物车
1)功能
a,商品列表
b,购买商品
c,查看购物车(查看购物车中所有购买的商品)
d,购物车中所有商品的总价
e,删除购物车中的某件商品
f,修改购物车中某件商品的数量
g,清空购物车中的所有商品
2)实现
step1 建表 
create table t_computer(
id bigint primary key auto_increment,
model varchar(20),
picName varchar(50),
prodDesc text,
price double);
step2 插入几条记录
insert into t_computer(model,picName,prodDesc,price)
values('x200','x200.jpg','good',2000);
insert into t_computer(model,picName,prodDesc,price)
values('x500','x500.jpg','good',3000);
insert into t_computer(model,picName,prodDesc,price)
values('x600','x600.jpg','good',5000);

day081、如果用户禁止cookie,如何继续使用session。
a,什么是url重写?
如果要访问的组件需要使用session机制,不能够
直接使用该组件的地址,应该使用服务器生成的
该组件的地址(该地址包含了sessionId)。
b,怎样进行url重写?
链接、表单提交:
String response.encodeURL(String url);
重定向:
response.sendRedirect(
response.encodeRedirectURL(String url));
转发与session无关。

2、过滤器
1)什么是过滤器?
servlet规范中定义的一种特殊的类,可以拦截
容器的调用过程并进行相应的处理。
2)如何写一个过滤器?
step1 写一个java类,实现Filter接口
step2 在doFilter方法里,实现过滤的处理逻辑。
step3 配置(web.xml)。
3)配置初始化参数
step1 web.xml中使用<init-param>添加初始化参数。
step2
String FilterConfig.getInitParamter(String param)
4)过滤器的优先级
如果有多个过滤器都满足过滤的条件,此时,
会按照<filter-mapping>配置的先后顺序执行。
5)过滤器的优点
a, 将一些通用的功能集中写在过滤器类里面,
方便代码的维护。经常将编码处理、权限、安全
控制、session验证等功能都可以集中写在过滤器里。
b,代码的“可插拔性"。增加或者减少某个功能,
不会影响到整个程序的正常运行。
3、监听器
1)什么是监听器
servlet规范中定义的一种特殊的类,用来监听
容器产生的事件,并对事件进行处理。
主要是两大类事件:
第一类: 生命周期相关事件,指的是容器
创建或者销毁ServletRequest,
HttpSession,ServletContext时产生的事件。
第二类:绑订相关事件,指的是容器调用
ServletRequest,HttpSession,ServletContext
的setAttribute,removeAttribute方法时产生的
事件。
2)ServletContext接口
a,当容器启动的时候,会为每一个web应用创建
唯一的一个ServletContext实例,该实例会一直存在,
除非容器关闭。
b,主要方法:
setAttribute(String name,Object obj);
removeAttribute(String name);
Object getAttribute(String name);
//访问全局的初始化参数
String getInitParameter(String paramName);
全局的初始化参数,指的是在web.xml中,使用
<context-param>配置的初始化参数。
//依据逻辑路径(path)获得实际部署时的物理
//路径。
String getRealPath(String path);
c,如何获得ServletContext实例?
ServletContext GenericServlet.getServletContext();
ServletContext HttpSession.getServletContext();
ServletContext ServletConfig.getServletContext();

3)如何写一个监听器:
step1 写一个java类,实现监听器接口(依据
监听的事件来选择相应的接口)。
step2 在监听器接口对应的方法里,实现监听的
处理逻辑。
step3 配置监听器。
案例:统计在线人数




4、上传文件(扩展)
step1 <form method="post"
enctype="multipart/form-data">
此时,浏览器不再对表单中的数据进行url编码了,
直接以二进制流的方式发送给服务器。
step2 在服务器端,不能够再使用
request.getParameter方法了,只能使用
InputStream request.getInputStream()获得一个
字节输入流,通过分析流来获得相应的数据。
一般使用一些工具来分析这个流。比如apache
提供的commons-fileupload.jar包来分析。



day091、servlet线程安全问题
1)线程安全问题产生的原因。
当有多个请求同时到达服务器时,容器会启动
对应的多个线程去处理请求,如果正好这些线程
调用的是同一个servlet对象的方法,就有可能产生
线程安全问题。
2)如何解决
a,加锁,使用synchronized对方法或者代码块加锁。
b, 让servlet实现SingleThreadModel接口。
容器会为每一个线程分配一个servlet实例。但是,
容器开销太大,不建议使用。
c,避免对servlet的属性作写操作。

一、servlet基础
1、什么是servlet?
2、如何写一个servlet?
3、什么是servlet容器?
4、http协议的相关知识(了解)
二、servlet核心
1、servlet核心的类与接口
a,Servlet接口
b,GenericServlet抽象类
ServletConfig getServletConfig();
ServletContext getServletContext();
c,HttpServlet抽象类
d,ServletConfig接口
String getInitParameter(String paraName);
ServletContext getServletContext();
e,ServletRequest/ServletResponse接口
f,HttpServletRequest接口
String getParameter(String paraName);
String[] getParameterValues(String paraName);
setCharacterEncoding(String code);
String getRequestURI();
String getContextPath();
Cookie[] getCookies();
HttpSession getSession()/getSession(boolean flag);
setAttribute(String name,Object);
Object getAttribute(String name);
RequestDispatcher getRequestDispatcher(String url);
removeAttribute(String name);
g,HttpServletResponse接口
setContentType(String type);
PrintWriter getWriter();
sendRedirect(String url);
addCookie(Cookie cookie);
encodeURL(String url);
encodeRedirectURL(String url);
h,ServletContext接口
setAttribute(String name,Object);
Object getAttribute(String name);
removeAttribute(String name);
String getRealPath(String path);
String getInitParameter(String paraName);
i,HttpSession接口
String getId();
setAttribute(String name,Object);
Object getAttribute(String name);
removeAttribute(String name);
invalidate();
setMaxInactiveInterval(int seconds);
j,Cookie类
setMaxAge(int seconds);
setPath(String path);
2、表单的处理
1)如何获得表单中的参数
2)表单中文问题
3、get请求与post请求
1)哪一些get请求,哪一些是post请求。
2) get请求的特点,post请求的特点
4、转发与重定向
1)什么是转发,重定向?
2)如何转发,重定向?
3)转发,重定向需要注意的问题
4)转发,重定向的特点
5)二者的区别?
三、状态管理
1)什么是状态管理
2)如何进行状态管理
3)cookie技术
a,cookie是什么?
b,如何创建一个cookie?
c,cookie的生存时间
d,cookie的路径
e,cookie的中文问题
f,cookie的限制
4)session技术
a,session是什么?
b,如何获得一个session?
c,session的常用方法
d,session的超时
e,如何删除一个session
f,session相关的案例
四、数据库访问
1,dao
1)什么是dao?
2)如何写一个dao?
3)dao的好处?
2, 在servlet中写jdbc代码需要注意的问题(
如何处理异常)。
五、过滤器、监听器
1、什么是过滤器?
2、如何写一个过滤器?
3、初始化参数
4、优先级
5、优点
6、什么是监听器
7、如何写一个监听器
六、上传文件(扩展)
七、案例
   增删改查
   session验证
   验证码
   购物车


1、jsp基础
1)什么是jsp?
sun公司制订的一种服务器端动态页面生成的技术规范。
2)如何写一个jsp?
step1 写一个.jsp为后缀的文件。
step2 添加如下的组成部分:
a,  html(css,js)
b,  java代码
java代码片断:  <%  %>
jsp表达式: <%=  %>
jsp声明: <%!   %>
用来给servlet添加属性和方法。
c,指令
page指令
import属性: 导包
pageEncoding属性: 告诉容器,.jsp文件保存时
的编码是什么。
contentType属性: 添加response.setContetType。
isELIgnored属性: true(缺省)/false,如果值为true,表示
忽略el表达式。
session属性:true(缺省)/false,如果值为false,则
对应的servlet不再声明和获得session对象,也就
是说,在jsp文件里,不能够使用session隐含对象了。
isErrorPage属性:true/false(缺省值),当值为true,
表示这是一个错误处理页面。
errorPage属性: 指定某个页面为错误处理页面。
include指令
file属性: 在指令所在的位置,插入file所指
定的文件的源代码。
比如:  <%@include file="head.jsp"%>
taglib指令
在jsp页面文件中,导入标签。
uri属性:指定一个命名空间
prefix属性: 指定命名空间的前缀
d,隐含对象
out
request
response
session
application
exception:
只有当页面设置了isErrorPage=true时,
才能使用该对象获得异常信息。
pageContext: PageContext实例,容器
会为每一个jsp实例创建唯一的一个Page
Context实例。
绑订数据:
setAttribute(String name,Object obj);
Object getAttribute(String name);
removeAttribute(String name);
访问其它几个隐含对象:
可以通过pageContext获得其它8个
隐含对象。
config:ServletConfig的实例。
page:表示jsp实例。
e, 活动元素
在jsp实例已经运行了,要求容器做一些操作。
而指令是.jsp文件转换成.java文件时,要求容器
作一些操作。
A.<jsp:forward  page="">:
转发,page属性指定转发的地址。
B.<jsp:include page="">
jsp实例在运行过程当中,调用另外一个
jsp实例。page属性指定调用的另外一个jsp
的地址。
C.<jsp:param name="" value="">
传参
D.<jsp:useBean id="" scope="" class="">
id:指定绑订名
scope:指定绑订范围,可以是page(指的是
pageContext隐含对象)、request、session
、application。
class:指定类名。
在scope指定的范围查找id指定的对象是否
存在,如果不存在,则创建并且绑订。
<jsp:getProperty name="" property="">
输出属性值
<jsp:setProperty name=""
property="" value="">
给name指定的对象的属性赋值。
property:指定属性名
value:指定属性值
param: 相当于request.getParameter();
采用“自省机制”给属性赋值。
<jsp:setProperty name="" property="*"/>
f, 注释
<!-- <%=new Date()%> -->
注释中的代码会执行,但不会在页面上输出。
<%--xxxx--%>
注释中的代码不会执行,也不会在页面上输出。


3) jsp如何执行的?
a, .jsp --> .java文件,即容器要将.jsp转换成一个对应的
servlet。
html ----> service方法里,使用out.write输出。
<%  %>--->service方法里,照搬。
<%= %>--->service方法里,使用out.print输出。
<%!  %> --->添加对应的属性和方法。
b,执行servlet的service方法。

2、jsp标签与el表达式
1)什么是jsp标签?
sun公司开发的一种技术,用来将jsp页面中的
java代码使用相应的标签来替换,这样做的目的是
:简化jsp页面,方便页面的维护。
2)什么是el表达式?
一套简单的计算规则,用于给标签的属性赋值。
现在,el表达式也可以脱离标签直接使用,用于
直接输出。
3)如何使用el表达式?
a,el表达式的基本语法
${el表达式}
b,访问bean的属性(将java对象的属性值输出)
${user.name}
容器会依次从pageContext、request、
session、application中查找绑订名为"user"
的对象。找到后,再调用该对象的getName
方法,并输出其结果。
如果依据绑订名找不到对应的对象,会
输出""。另外,会将null转换成""输出。
如何要指定查找范围,可以使用pageScope,
requestScope,sessionScope,applicationScope
来指定查找范围。比如:
${requestScope.user.name}
此外,还可以使用:
${user["name"]},允许[]里面出现变量。 该语法
也允许访问数组的某个元素。比如
${user.interest[0]}
c, 访问请求参数值。
${param.username}
相当于 request.getParameter("username");
${paramValues.interest}
相当于 request.getParamterValues("interest");
d, 将表达式的结果直接输出,或者给标记的
属性赋值。
算术运算: 进行"+","-","*","/","%",但是,
"+"运算不能够进行字符串的连接操作。
关系运算:进行"==","!=",">","<",">=",
"<="六种关系运算。
逻辑运算:进行"&&","||","!"三种逻辑运算操作。
empty运算:
以下四种情况,结果为true。
空字符串
集合内容为空
值为null
找不到对应对象
4) jstl(标准标签库):
java standard taglib
a,如何使用标签
step1 将标签所对应的.jar文件添加到WEB-INF\lib
下面。比如,如果要使用jstl标签,应该将
standard.jar,jstl.jar 拷贝到lib下。
step2 在jsp页面当中,使用taglib指令导入相应的
标签。
b, jstl标签的使用
<c:if test="" var="" scope="">:
当test的值为true时,会执行标签体的内容。
可以使用el表达式给test属性赋值。
var指定绑订名
scope指定绑订的范围
<c:choose> <c:when test=""> <c:otherwise>:
当有多个分支时,使用choose标签。
when表示一个分支,可以出现多次
otherwise表示例外,出现1次。
<c:forEach items="${users}"
var="user" varStatus="">:
对集合进行遍历。
items指定要遍历的集合
var指定绑订名
<c:out>
<c:remove>
<c:set>
<c:catch>
<c:url>
<c:import>
<c:redirect>










分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics