servlet总结

servlet总结:
网络程序现在最使用的三层构架 浏览器 web服务器 DB数据库
BS架构的优势:
特点:
数据库只负责数据的管理
web服务器负责业务逻辑的处理
浏览器负责提供页面操作
优点:
不需要单独安装客户端
开发相应的cs简单,客户端和服务端的通信模块都是使用标准的
HTTP协议进行通信
Servlet就是一个扩展web服务器功能的组件规范(即是服务器中的准讯http协议的功能扩展组件)

组件:在软件开发行业 符合一定规范 实现部分功能 并且需要部署到容器中
才能运行的软件模块
容器:符合一定规范 提供组件运行环境的一个程序

servlet运行原理:
浏览器-web服务器(Apache)-servlet容器(Tomcat)

如何开发一个servlet?
安装Tomcat
步骤:
1.编写一个实现Servlet接口或继承HttpServlet的java类
2.用javac命令编译源文件为字节码文件
3.用编完的组件打包
4.部署文件并拷贝到webapps文件下
5.启动并访问地址栏(web.xml中写的地址)

什么是Http?
就是由w3c指定的web服务器和浏览器之间如何交互通信的数据格式

两个对象负责浏览器和服务器之间的数据请求和回应

HttpServletRequest代表客户端的请求 请求中的所有数据都封装在这个对象中 通过这个对象的相关方法可以获取请求数据
作用:
读取和写入Http请求数据
取得和设置Cookies
取得路径信息
表示HTTP会话
实现请求转发

HttpServletResponse对象
代表提供给客户端的响应 封装了Http的相应数据 通过这个对象可以设置状态行 消息头 实体内容
作用:
设置客户端的输出内容
设置相应的是状态吗
设置浏览器的解码方式
设置Cookies
实现重定向

获取请求方法:
getParamter(name)(1:1)
getParamterValues(name)(1:M)
请求方式 (get post head put delete  一般多用get和post)

get请求 当需要向服务器请求指定资源是使用
什么时候浏览器发送get请求:在地址栏输入一个地址 点击链接 表单默认提交

特点:会将数据添加到资源路径后面 只能提交少量的数据
请求参数显示浏览器地址栏上 不安全

post请求
向服务器提交需要处理的数据 这些数据写在请求的内容里 可以导致新资源的产生和已有资源的更新
什么时候浏览器发送post请求
设置表单method属性为post
特点:
请求参数添加到实体内容中 可提交大量数据
不会将请求参数显示在浏览器地址栏 相对安全

乱码问题:
get的解决方式
 第一种为在tomcat的文件里修改连接的端口的解码方式:以8080为例,就是在其方法里面添加一行代码:URIEncoding="utf-8";直接在根源处解决,一劳永逸;
 第二种则是在Servlet里编写代码对获取到的请求数据进行编译器选择编译。也就是将获取到的乱码String再回炉重造下,代码为:
                    String code=req.getParameter("code");   code=new String(code.getBytes("iso8859-1"),"utf-8");      这个方法是在Servlet里解决,灵活性比第一种好。

post方式:

1.在请求前书写代码req.setCharacterEncoding("utf-8");//只对post有效  优点:简单
2.发送响应时:res.setContentType("text/html ;charset=utf-8");//浏览器上显示正确编码

servlet运行步骤:
1.浏览器依据IP建立与容器的连接
2.浏览器请求数据打包
3.容器解析请求数据包 封装对象
4.容器依据路径找到servlet创建对象
5.容器调用servlet对象的service方法
6.容器将相应打包发给浏览器
7.浏览器取出结果 生成页面
web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>

        <servlet-name>helloServlet</servlet-name>
        
        <servlet-class>web01.HelloServlet02</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        
        <url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>



开发servlet有三种方法:
a,实现servlet接口;
要重写service方法即可

b,继承GenericServet;

c,继承HttpServlet.
需要重写doGet、doPost方法。






重定向:
服务器想浏览器发送一个302状态码及一个Location消息头
浏览器收到后会立即想重定向地址发出请求

早期解决互联网网站跳转问题。在项目里:保存、新增、删除后重定向到查询.  (302为重定向 )
如何重定向?
response.sendRedirect(String url)
return "redirect:toindex.do"

重定向特点:
重定向的地址可以市任意的
重定向之后 浏览器地址栏会发生改变
重定向过程中涉及到的web组件并不会共享同一个request和response对象



model 1:
    浏览器发请求给服务器----Servlet/JSP-----DAO---DB---DAO---Servlet/jsp---浏览器
model 2:引入了MVC经典设计模式
    将服务端代码分为了三部分:按功能划分:1.C 处理请求Controller控制层2.V 显示View视图层3.M 用来处理业务Model
     在学习中C为Servlet,V为JSP,M为DAO
   可以对代码解耦,便于团队开发。


如何实现一个servlet实现多个请求?
在web.xml中配置:
保留一堆servlet  一对servlet-mapping  在url-pattern中修改内容为*.do

通过request.getRequestURL()方法中获取请求资源路径
分析后分发
if(){

}else if(){

}.....

servlet生命周期:

实例化
容器调用servlet构造器 创建一个servlet对象
初始化
一般由GenericServet创建 不需要我们创建 init()只执行一次
处理请求(业务逻辑)
就绪
容器收到请求后调用servlet()来处理请求
销毁(destroy)
容器依据自身的算法删除servlet()对象  只执行一次

Servlet接口
包括init servlet  destroy
GenericServle(抽象类)核心类
实现了servlet的部分方法(init和destroy )和service方法


servlet上下文
上下文是servletcontext 是一个全局的存储信息的空间 服务器启动它就存在 服务器关闭他就释放  为了节省空间 提高效率 他必须存储重要的 所有用户都共享的线程又是安全的信息
servletContext:唯一性   一直存在

获取上下文
GeneriServlet 提供getServletContext()
ServletConfig 提供getServletContext()
HttpSession 提供getServletContext()
FilterConfig 提供getServletContext()


Servlet跳转与EL表达式
在Servlet中操作内置对象
1.取得session对象
    操作session依靠request取得
    public HttpSession getSession();
2.取得application
 public ServletContext getServletContext();
   用法:super.getXX();
  Servlet跳转
 1.使用Servlet采用客户端跳转到jsp页面
    response.sendRedirect()实现跳转
   无法传递request,几乎不用
2.使用Servlet服务器端跳转到JSP页面
如果在JSP页面上,可以用<jsp:forward />实现服务器端跳转,但是Servlet中并没有此类
  标签,如果要实现服务器端跳转,要使用requestDispatcher接口完成。
   有两个方法:
    1.跳转:public void forward(ServletRequest request , ServletResponse response);
    2.包含:public void include (...) ;  
获得RequestDispatcher只能用ServletRequest接口取得
      public RequestDispatch getRequestDispatcher(String path);



转发
将未完成的处理通过容器转交给另一个web组件继续处理
步骤 1.绑定数据到request对象  2.获取转发器  3.转发
request.setAttribute(String name,Object obj);//绑定数据
request.getAttribute(String name)//获取数据
request.getRequestDispatcher(url)//获取转发器
rd.forward(request,response)//实现转发
requestDispatcher  rd=request.getRequestDispatcher(url).forward(request,response)//这句是将第二部和第三步合成一句

removeAttribute移出数据
特点:绑定的数据在整个应用上的所有组件共享 一直可以被访问
注意:转发的目的地是同一个地址   并且forword之后的代码也一定会执行


1. request的setAttribute与getAttribute方法一般都是成对出现的,首先    通过setAttribute方法设置属性与属性值,然后通过getAttribute方法    根据属性获取到与该属性对应的对象值(获取到之后一般都需要进行向下    类型转换,将属性值转换为真正的对象)。setAttribute与    getAttribute方法都是在服务器端内部执行的,客户端不知道服务器端       是否执行过这两个方法。
2. request的getParameter方法的作用是获取到客户端 通过表单或url请求参    数所发送过来的参数值,是客户端与服务器端之间的交互,服务器端要想    获取到客户端发送过来的数据,就需要使用getParameter方法来获取。没    有与getParameter方法对应的setParameter方法。
3. request对象内数据的存活范围就是在request对象的存活范围内,当客户    端向服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对    象就被销毁了;之后再向服务器端发送新的请求时,服务器会创建新的    request对象,该request对象与之前的request对象没有任何关系,因此   也无法获得在之前的request对象中所存放的任何数据。
4. session对象内数据的存活范围也就是session对象的存活范围(?只要浏   览器不关闭,session对象就会一直存在?),因此在同一个浏览器窗口中   ,无论向服务器端发送多少个请求,session对象只有一个。
5. application(应用对象):存活范围最大的对象,只要服务器没有关闭,   application对象中的数据就会一直存在。在整个服务器运行过程当中,   application对象只有一个。
6. request、session以及application这3个对象的范围是逐个增加的:   request只在一个请求的范围内;?session是在浏览器窗口的范围内?;   application则是在整个服务器的运行过程中。




JSP 本质是servlet  是servlet的简化写法 可以与web servlet相互转换      <% %>
是sun公司指定的一种服务器端动态页面技术的组件规范
(由html和少量java代码构成 用%%包起来)
page指令  用于导包  设置页面属性
include指令 能将其他文件包含进来  也可以是静态的文件


内置对象有(可以直接调取):
request  response out session
application  pageContext page config  exception
如何运行
1.拷贝静态页面代码到JSP页面
2.添加page指令pageEncoding和content
3.修改页面内容与目标页面一致
4.将需要动态生成的内容删除 替换为java代码



异常处理
使用转发进行跳转到指定页面进行提示说明
request.getRequestDispatcher(url).forward(request,response)
抛出异常
throw new ServletException(e)
web.xml文件中配置错误处理页面节点




状态管理
就是对客户端和服务端之间相互交互的数据就行管理或保存修改
客户端状态管理技术 Cookie技术  (将状态保存在客户端)
服务器状态管理技术 session技术  (将状态保存在服务端)

创建cookie
Cookie c=new Cookie(String name,String value);
request.add(c)

查询cookie
Cookie request.getCookies(c)

修改 Cookie[] Cookies=request.getCookies();
if(cookies!=null){
Cookie c=Cookies[0];
String value=c.getValue();
value=URLDecoder.decode(value,"utf-8")
}
Cookie 只能保存少量的数据  个数有限   只能保存字符串
生命周期 默认随着浏览器的关闭而关闭
可通过Cookie.setMaxAge(int seconds)自行设置时间
编码  Cookie c=new Cookie("city",URLEncoder.encode("北京","utf-8"))


session 有id属性

获取session
HttpSession s=request.getsession();
等价于request.getSession(true)
立即删除session对象
session.invadate()


一般先绑定在读取  没有就返回页面(多用于验证 登录)


浏览器若禁用Cookie 则session也不能用 可以使用URL(即:使用修改过的地址)重写来发送sessionid


.cookie和session总结
1.通俗的理解
它们都能用来临时存储数据,并具备如下特征:
所存数据可以在多个请求间共用.
所存数据可以在多个Servlet间共用.
每个浏览器会有一份单独的cookie和session.
2.专业的理解
HTTP协议是一个无状态协议,即协议没有要求服务器记住浏览器.
cookie和session就是用来让服务器记住浏览器的手段,即用来管理状态的.
状态:服务器记住浏览器的证据(数据).

实现重写
若是连接地址和表单提交request.encodeURL(String url)

若是重定向request.encodeRedirectURL(String url)生成重写后的url

session 安全 保存的数据类型丰富  可保存更多数据






JSP标签用来替代java代码
EL表达式是一套简单的计算规则 用于JSP标签的属性赋值 也可以用来直接输出
EL表达式的作用
访问Bean的属性
输出简单的运算结果
获取请求的参数值

${对象名.属性名}
${对象名[“属性名”]}
属性名不能写错 否则报错
容器从pageContext request session application查找对象

JSTL:JSP的标签库
1.将JSTL标签对应的jar文件拷贝到WEB-INF/lib目录下
2.使用taglib指令导入到要使用的JSP标签
<%@taglib uir="" prefix=""%>  uir:JSP标签的命名空间
                              prefix:命名空间的前缀
核心标签-if标签

<c:if test="" var="" scope=""></c:if>
var和scope要配合使用

choose标签
<c:choose>
    <c:when test=""></c:when>
</c:choose>


forEach标签

<c:forEach var="" items=""></c:forEach> items指要便利的集合

以及自定义配置标签

JSTL替换形式

<%= %>    <%  %>  替换为${}   <c:xxx   >...</c:xxx>

               

转发与重定向的区别

 1)转发
 a)地址栏不会改变
 b)转发只能转发到当前web应用内的资源
 c)可以在转发过程中,可以把数据保存到request域对象中

2)重定向            
a)地址栏会改变,变成重定向到地址。
b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
c)不能再重定向的过程,把数据保存到request中。
结论: 如果要使用request域对象进行数据共享,只能用转发技术!!!
            
当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。
与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。


webinf下的数据文件是受保护的    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值