servlet

来源:互联网 发布:怎么注册网站域名备案 编辑:程序博客网 时间:2024/06/06 05:54

servlet

http:超文本传输协议
     请求和响应
servlet:
运行在服务器端的一个java小程序,本质就是个类
接受请求,处理逻辑,生成动态内容
编写步骤:
1.编写一个类
继承HttpServlet
重写doGet或者doPost方法
2.编写路径
<servlet>
<servlet-name>
<servlet-class>


<servlet-mapping>
<servlet-name>
<url-pattern>
3.测试
http://主机:端口号/项目名称
servlet体系结构
servlet->GenericServlet->HttpServlet
doGet():处理get请求的逻辑
doPost():处理post请求的逻辑


servlet的生命周期
inint(ServletConfig config)
service();
dertory();
<url-pattern>
完全匹配:/a/b
目录匹配: /a/b/*


一个路径只能对应一个servlet
一个servlet可以对应多个路径


当我们项目处理不了请求的时候,服务里面defaultServlet来处理


ServletContext
上下文(全局管理者)
作用:
1.获取全局的初始化参数
2.共享资源
3.获取资源
4.获取文件的mime类型
获取:getServletContext()
常用方法:
String getInitParameter(String key):根据key获取指定的初始化参数
String getRealPath(String 文件路径):获取指定文件在tomact上的绝对路径
InputStream getResourceAaStream(String 文件路径):以流的形式返回一个文件
String getMimeType(文件名);返回文件的类型
servletConfig(了解)
servlet的配置对象
作用:
获取servlet的名称
获取servlet初始化参数
获取全局管理者


response:响应
作用:往浏览器中写东西
组成部分: HttpWatch
响应行 :
格式:
协议/版本 状态码 状态码的说明
状态码:
1xx:已发送请求
2xx:已完成响应
200:正常响应
3xx:还需要浏览器进一步操作
302:重定向 配合响应头location
304:读缓存
4xx:用户操作错误
404:页面没找到
405:访问的方法不存在
5xx:服务器错误
500:内部异常
响应头 :
location:重定位
refresh:定时刷新
content-type:设置文件的mime类型,告诉浏览器用什么编码打开
content-disposition:文件下载
方式一:
         http的meta标签
   <meta http-equiv="refresh" contest="3:/day15/refresh2.html">
方式二:
   response.setHeader("refresh","秒数;url=地址")
重定向:
方式一:
response.setSattus(302);
response.setHeader("location","/day15/loc2");
方式二:
response.sendRedirect()


响应体:页面上显示的内容
Writer getWriter();字符流
ServletOutputStream getOutputStream();字节流
自己写的东西要用字符流,其他一概用字节流
注意:两个流是互斥的
处理响应体中文乱码:
方式一:
response.setContenType("text/html;charset=utf-8");
方式二;
response.setHeader("content-type","text/html;charset=utf-8");
1.文件下载:
<a href="day15/donwload/day10.doc">
若浏览器能解析资源mime类型,则打开,若不能直接下载
2.编码下载  通过servlet完成
<a href="day15/donwload/day10.doc">
a.设置文件的类型
b.设置下载头信息 content-disposition
c.拷贝流
扩展:通过response生验证码
验证码:
作用:防止暴力攻击
request
作用:浏览器发送过来的数据
组成部分:
请求行   请求头  请求体

请求行:
格式:
请求方式 请求资源 协议/版本
掌握方法:
String getMethod():获取请求方式
String getRemoteAddr();获取ip地址
String getContextPath();获取项目名称
了解:
getRequestURI():获取的是从项目名称到参数的内容
getRequestURL():获取的是带协议的完整路径
http://localhost:8080/day15/regist
String getQueryString();get请求的所有参数
String getProtocol();获取协议和版本
请求头:
格式:key/value(value可以是多个值)
常用的方法
**String getHeader(String key):获取指定的value(一个)
了解的方法:
Enumeration getHeaders(String key):通过key获取指定的value(多个)
Enumeration getHeaderNames():获取所有请求头的名称
getIntHeader(String key):获取整形的请求头
long getDateHeader(String key)获取时间的请求头
重要的请求头
user-agent:浏览器的内核  mise firebox  chrome
referer:页面从哪里来 反盗链

操作请求参数:
username=Tom&password=123&hobby=eat&hobby=drink
常用方法:
String getParameter(String key):获取一个值、
String[] getParametervalue(String key):获取多个值
Map<String String[]>getParameterMap();获取所有参数和值


请求的中文乱码:
原因:编码和解码的格式不一
对于get请求:参数一般追加到地址栏中,使用utf-8编码,
    服务器接收到请求后,使用iso-8859-l
对于post请求:参数是放在请求体重,服务器获取请求体的时候使用iso-8859-1解码
也会 出现乱码
通用的方法:编码和解码格式一样
new String(参数.getBytes("iso-8859-1"),"utf-8")
针对于post请求来说们只需要将请求流的编码设置成utf-8即可
request.setCharcterEncoding("utf-8")
域对象
request:
创建:一次请求的时候
销毁:响应生成的时候
请求转发
request.getRequestDisPatcher("内部路径").forward(request,response);


请求转发和重定向的区别:
重定向:发送两次请求,请求转发:一次请求
重定向:地址栏发生改变,请求转发:不变
重定向:从浏览器发送 请求转发:是服务器内部
重定向:response的方法,请求转发:是request的方法、
重定向:可以请求站外资源 请求转发:请求站内资源。


扩展:
URLEncoder.encode(s."utf-8"):指定编码
URLEncoder.decode(s."iso-8859-1"):指定解码

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

jsp cookie session

案例一:记录用户上次访问时
需求:
当用户第一次登录的时候,提示,您是第一次登录,且记录该次访问时间
下一次访问的时候,获取上一次访问且展示出来
技术:
jsp
会话技术
cookie
jsp:java server pages(服务器页面吧)
本质上JSP就是一个servlet,在html代码中嵌套java代码
运行在服务器端,处理请求,生成动态的内容
对应的java和class文件在Tomact目录下的work目录后缀名就是.jsp
执行流程:
1.浏览器发送请求,访问jsp页面
2.服务器接受请求,jspServlet 会帮助我们查找对应的jsp文件
3.服务器会将jsp页面翻译成java文件
4.JVM会将java编译成.class文件
5.服务器运行.class文件,生成动态的内容
6.将内容发送给服务器
7.服务器组成响应信息,发送给浏览器
8.浏览器接收数据,解析展示。


jsp的脚本
<%...%>java程序片段
生成JSP的service方法中
<%=...%>输出表达式      不能以分号结尾
生成在jsp的service方法中,相当于java中调用了out.print()
<%!...%>声明成员
成员位置 
会话技术:
当用户打开浏览器的时候,访问不同的资源,直到用户将浏览器关闭可以认为是一次会话


因为http协议是一个无状态的协议,它记录不了上次访问内容
用户在访问过程中难免会产生一些数据。

通过会话技术(cookie session)保存这些数据
例如:
用户登录
验证码
购物车
访问记录
cookie:浏览器会话技术
session:服务器会话技术

cookie:
小饼干 小甜点
cookie是由服务器生成,通过response将cookie写回浏览器(setCookie)保留在浏览器上。
下一次访问时,浏览器根据一定的规则携带不同的cookie(通过request的头)
我们服务器就可以接受cookie
cookie的API
new Cookie(String key,String value)
写会浏览器
response.addCookie(Cookie c)
获取cookie:
Cookie[] request.getCookies()
cookie的常用方法
getName():获取cookie得key
getVlaue():获取指定的cookie的值
记录用户上次访问时间
步骤分析
1.创建一个servlet RemServlet 路径:rem
2.在servlet中:
获取指定的cookie 例如:名称为lastTime
request.getCookies();
判断cookie是否为空
若为空:指示信息 第一次访问
若不为空:
获取此cookie得value
展示信息:你上次的访问时间是...

设置编码
response.setContentType("text/html;charset=utf-8");
1.获取指定名称的cookie
2.判断cookie是否为空
3.将当前的时间记录下来
cookie总结:
常用方法
setMaxAge(int 秒):设置cookie在浏览器存活时间以秒为单位若设置为0:删除                        该cookie(前提必须路径一致)
setPath(String path):设置cookie的路径
默认路径:
访问的servlet路径,从”/项目名称”开始,到最后的"/"结束

例如:
访问的servlet路径
/day16/rem    /day16
/day16/a/b    /day16/a
手动设置路径:以“/项目名称”开始,以"/"结尾
注意:
cookie不能跨浏览器
cookie中不支持中文
案例二:
记录用户浏览历史
需求:
当用户访问一个商品的时候需要将该商品保留到浏览器中。
技术:cookie   new Cookie("iss","1-2-3")
步骤分析:
1.先将product_list.html转成jsp

2.点击一个商品,展示该商品的信息,将该商品id记录到cookie(GetProductById)
获取之前的浏览记录,例如名称ids
判断cookie是否为空
若为空:将当前商品的id起个名称ids放入到cookie中 ids=1-2-3
若不为空:获取值 例如ids=2-1 当前访问的id=1
判断之前记录中有无该商品
若有:将当前的id值放到最前面 结果 ids=1-2
若没有:继续判断长度是否>=3
若>=3,移除最后一个,将当前的id放到最前面
若<=3, 直接将单钱的id放入到最前面
若ids=3-2-1 现在访问1, 结果1-3-2
若ids=4-3-2 现在访问1, 结果1-4-3
3.再次回到product_list.jsp页面中,需要将之前的访问商品展示在浏览记录中
获取ids 例如ids=1-2-3
切割
扩展:删除浏览记录
技术分析:
cookie.setMaxAge(0);
步骤分析
1.在浏览器中添加一个超链接
<a href="/day/clearHistory">清空</a>;
2.创建一个ClearHistoryServlet
创建一个cookie
        名称和路径都要保持一致
setMaxAge(0)
3.页面跳转
重定向


案例三:添加购物车
需求:在商品详情页有一个添回购物车,点击则将该商品添回购物车,
    点击购物车将里面所有的商品展示出来
技术:session

session:
服务器端会话技术
当我们第一次访问的服务器的时候,服务器获取id
不能获取id:
创建一个session,将你的数据保存到这个session中,将当前的session
的id返回给浏览器
能获取id:
要拿着这个id去服务器中查找有无此session
若查找到了:直接拿过来使用,将数据保存,返回给session的id
   返回给浏览器
若没有查找:创建一个session,将你的数据保存到session中
   将当前的session的id返回给浏览器
session是基于cookie技术来实现的。
获取一个session:
HttpSession request.getSession();
域对象:
xxxAttibute()
生命周期:
创建:第一次调用request.getSession()创建
销毁:服务器关闭
session:超时
默认的时候超过30分钟 web.xml有配置
手动设置超时:setMaxInactiverval(int 秒)了解
手动清除session:
session.invalidate();
存放私有数据

步骤分析:
1.点击添加到购物车的时候,提交到一个servlet  add2CartServlet
需要将商品的名称携带过去
2. add2CartServlet中的操作
获取商品的名称
将商品添加到购物车中,购物车的结构
Map<String 名称,Integer 购买数量>
将map放入到session中
   将商品添加到购物车中:
获取购物车
判断购物车是否为空
若为空:
第一次添加
创建一个购物车
将当前的商品放进去,数量:1
将购物车放入到session中
若不为空:继续判断购物车中是否有该商品
若有:
  取出count,将数量+1
     将商品再次放入到购物车
若没有:
      将当前商品放进去,数量:1
提示信息:xx已添加到购物车中
3.点击购物车连接的时候  cart.jsp
从session中获取购物车
          判断购物车是否为空
若为空:提示信息
若不为空:遍历购物车即可

扩展清空购物车
思路1:将购物车移除
思路2:将session干掉
步骤分析:
在cart.jsp添加一个超链接 清空购物车
<a href="/day/clearCart">清空购物车</a>
创建ClearCartServlet  session.invalidate()
重定向到购物车页面
------------------------------------------------------------------------------------------------------

jsp/el/jstl

案例一:在页面中展示所有的商品,不能使用jsp的脚本
技术分析:jsp/el/jstl
    jsp:
java服务器页面
   作用:将内容的生成和信息的展示分离开来运行在服务器端,本质就是servlet,产生相对应的
 class文件和java文件放在work里
    jsp的脚本:
<%...%>java代码片段
<%=...%>输出表达式 相当于out.print();
<%!..%>声明成员,成员位置 
    jsp的指令:
作用:声明jsp页面的一些属性和动作
格式:<%@ 指令名称 属性="值" 属性="值" %>
指令的分类:
page:主要是声明jsp的一些属性
include:静态包含
tagblib:导入标签库
注意:一个页面可以出现多个指令
指令可以写在任意位置,一般放在jsp页面最上面

page指令:
重要的三个属性:
contentType:设置响应流的编码,及通知浏览器用什么编码打开
    设置文件的mimetype
pageEncoding:设置页面的编码
import:导入所需要的包
contentType和PageEncoding联系:
若两者都出现的时候,各自使用各自的编码
若只出现一者的时候,两个都使用出现的这个编码
若两者都不出现的时候,使用服务器默认的编码iso-8859-1
了解的属性;
language:当前jsp页面可以嵌套的语言
buffer:设置jsp页面的流的缓冲区大小
autoFlush:是否自动刷新
extend是:声明当前jsp的页面继承与哪个类,
 必须继承的HttpServlet及其子类。
session:设置jsp页面是否可以使用session内置对象
isElignored:是否忽略el表达式
erroPage:当前jsp页面如果出现异常的时候要跳转到jsp页面
isErrorPage:当前jsp页面是否是一个错误的页面若值为true,
    可以使用jsp页面一个内置对象Exception
include指令:
静态包含,就是将其他页面或者servlet的内容包含进来,一般进行编译运行
生成一个java文件
格式:<%@include file="相对路径或者是内部路径"%>
例如:<%@include file="/jsp/include/i1.jsp" %><hr/>
路径:
相对路径:
/或者什么都不写:当前路径
上一级路径 ../
绝对路径:
带协议和主机的绝对路径
不带协议和主机的绝对路径
/项目名/资源
内部路径:
不带协议和主机的绝对路径去掉项目名称
请求转发  静态包含  动态包含
taglib指令:导入标签库
格式:<%@taglib prefix="前缀名" url="名称空间"%>
若导入之后
<前缀名:标签名>
例如: <c:if test="">输出内容</c:if>
jsp的内置对象:***(9大内置对象)
在jsp页面上可以直接使用的对象
内置对象    类型
out    jspWriter
request    HttpServletRequest
response    HTTPServletResponse
session     HTTPSession
exception   Throwable
page        servlet
config      ServletConfig
application ServletContext
pageContext PageContext
jsp里的域对象:理解
application      整个项目
sesstion         一次会话
request          一次请求
pageContext      一个页面
pageContext:
1.域对象
XXXAttribute(...int scope);
2.操作其它对象
XXXAttribute(...int scope);
scope取值:
APPLICATION_SCOPE
SESSION_SCOPE
REQUEST_SCOPE
PAGE_SCOPE
3.获取其它的内置对象
getxxx();
getRequest();获取request内置对象
4.便捷查找
findAttribute
依次从pageContext,request,session,application四个域中
查找相应的属性,若查找到了返回值结束该次查找,
若找不到,返回null值,
jsp的动作标签
<jsp:forword>:请求转发
相当于java中 request.getRequestDispatcher().forword();
<jsp:include>:动态包含
就是将被包含页面或者servlet的运行结果包含到当前页面中




el:
  jsp的内置表达式语言 从jsp2.0开始
  用来替代<%=...%>
  作用:
1.获取域中的数据  ***
2.执行运算        ***
    3.获取常见的web对象
4.调用java方法
  格式:${el表达式}

  获取域中对象
注意***
若属性名出现了"."或者"-","+"等特殊符号,
需要使用scope获取
${requestScope["user.age"]}
获取简单数据
${pageScope/requestScope/sessionScope/applicationScope.属性名}
${属性名}:依次从pageContext,request,session,application
若查找不到,返回""
获取复杂数据
获取数组中的数据
${域中的名称[index]}
获取list中的数据
${域中的名称[index]}
获取map中的数据
${域中的名称.键名}
javabean导航
javabean:java语言编写的一个可重用的组件
狭义上来讲就是我们编写一个普通java类,例如user
javabean规范;
1.必须是一个公共的具体类 public class
2.提供私有的字段 private String id;
3.提供公共访问字段的方法 get/set/is方法
一旦有公共的方法之后,get/set之后的内容
必须将字母小写,将这个东西称之为bean属性
4.提供一个无参的构造器
5.一般实现序列化接口  serialzable


${javabean名称,bean属性}
执行运算:
四则运算 关系  逻辑
注意:
+:只能进行加法运算法,字符串形式的数字可以进行加法运算
empty:判断一个容器的长度是否为0(array set list map)
还可以判断一个对象是否为空
${empty 域中的对象名称}
三元运算符
el的内置对象(了解)
11个:
pageScope
requestScope
sessionScope
applicationScope

param
paramValue

header
headerValue


initParam

cookie***
pageContext***
注意:
除了pageContext其余对象获取的全是map集合


了解:和参数相关的el内置对象
param
paramValue


了解:和请求头相关的el内置对象



header
headerValue


了解:和全局初始化相关的el内置对象
initParam


cookie内置对象
${cookie名称}:获取map集合{key=value}
Cookie c =new Cookie("username","lisi")
${cookied名称}:获取相当于
${username=new Cookie("username","tom")}
相当于map中的key是cookie的值
map的value是当前cookie
若想获取名称username的cookie的value(获取list)
${cookie.username.value}
cookie常见的API
getName()
getValue()

jstl:
jsp的标签库
apache
用来代替java脚本
<% 
if(){}else{}
%>
使用步骤:
1.导入jar包(jstl.jar和standard.jar)
2.在页面上导入标签库
<%taglib prefix="" uri=""%>




jstl分类:
core:核心类库
fmt:格式化 |国际化
xml:过时了
sql:过时了
函数库:很少使用


core:核心类库
c:if  **
c:foreach**
c:set
c:choose c:when c:otherwise


c:if:判断
<c:if test="${el表达式}">满足的时候输出的内容</c:if>
例如:
<c:if test="${3<5 }">
3小于5
</c:if>
c:forEach:循环
格式1:<c:foreach begin="从哪里开始" end="到哪里结束" setp="步长" var="变量名"
varStatus="循环状态变量">
varStatus:用来记录循环的状态
常用的属性:
count:记录次数
current:当前遍历的内容
例如:
    <c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
${i}---- ${vs.count}-------${vs.current}<br/>
</c:forEach>

格式2:<c:foreach items="${el获取域中的容器}"var="n">
${n}
</c:foreach>
函数库:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
jsp注释:
html注释 <!--   -->
注释的内容只有页面上看不到  java代码和html源码都有
java注释//
只有java代码中存在
jsp注释<-- -->
只在jsp页面中存在,翻译成java文件之后就没有了
       

































原创粉丝点击