java Web Servlet

什么是Servlet:

  • 平台独立,性能优良,能以线程方式运行
  • Servlet API为Servlet提供了统一的编程接口
  • Servlet一般在容器中运行,Servlet容器负责Servlet和客户的通信以及调用Servlet的方法
  • Servlet和客户的通信采用“请求/响应”的模式
  • 通常是通过HTTP协议进行工作的

Servlet与JSP

  • JSP与Servlet关系很密切,所有JSP程序在执行时都被编译转变成Servlet
  • Servlet利用(多线程机制)可以同时为多个请求服务
  • Servlet基本流程
    在这里插入图片描述
    在这里插入图片描述
  • 使用用户自定义的Servlet:
    在这里插入图片描述

Selvlet版本进入区别:

在这里插入图片描述

控制层Web开发

通过response对象对用户进行响应

  • 创建输出流对象
    • PrintWriter out = response.getWriter();
  • 使用out对象响应用户
    • out.println(“这是通过Servlet响应用户的信息”)

通过request对象获取请求信息

获取客户端传递的请求参数:

  • String getParameter(String name)
    • 获取字符串
  • String[ ] getParamterValues(String name)
    • 获取字符串数组
  • 客户浏览器通过使用以下 方法把请求参数传给servlet :

Get方法请求

  • GET(数据量少,安全性要求不高,速度快)
    • 默认表单请求方式(method)
      通过问号直接传值
  • 用?分割、参数用&连接。
  • URL?参数名1=值&参数名2=值&…
  • 从这点看来,GET请求的地址栏会改变,可以会暴露信息,安全性没有post高
    在这里插入图片描述

Post方法请求

    • POST(数据量大,安全性要求高)
      • 通过单独的套接字连接发送包数据
      • 完整的事务对客户是不可见的
      • 与GET方法比较起来较慢
  • html文件应放在WebContent文件下(当然可以通过相对路径或者绝对路径进行切换)
  • web.xml文件应放在WEB-INF下,并且配置servlet时需要注意:
    • servlet-class:是运行java文件的路径:com.org.InputServlet
    • servlet-name:是需要在servlet-mapping确认你调用他的名字
    • url-pattern:调用某个java文件(调用名)
  • POST请求会把请求的数据放置在HTTP请求包的包体中。
  • 我们可以先通过调用html文件,然后利用post请求:
    在这里插入图片描述
  • 然后提交数据:
    在这里插入图片描述

RequestDispatcher接口

  • [1].实现请求转发:
  • forwardObj.forward(request,response);
  • [2].实现请求包含:
  • forwardObj.include(request,response);
  • <2>请求重定向
  • 特点:发送了两次请求,响应了两次,不能和request域对象配合使用.

Servlet生命周期:

掌握Servlet生命周期及其对应方法

  • 加载程序、初始化、服务、销毁、卸载
    在这里插入图片描述

  • 刚开始运行Servlet时,会调用一次init()和service()
    在这里插入图片描述

  • 每一次刷新界面都会调用service(), 对用户发来的请求进行调用
    在这里插入图片描述

  • 关闭tomcat服务器就会显示销毁的数据
    在这里插入图片描述

  • 延迟5s销毁:
    在这里插入图片描述

调用Servlet父类service()方法要注意:

  • 会重写父类中的service程序,则java程序中不在调用其他服务,只调用当前重写的service()程序(不调用doPost和doGet方法)
    在这里插入图片描述

  • 当没有service方法时,会根据用户的请求进行调用doGet方法和doPost方法

直接在启动时调用init()方法:

在这里插入图片描述

  • 在配置文件中添加:《load-on-startup》1《/load-on-startup》
    在这里插入图片描述

中文乱码处理:

ASCII:

  • 所有编码由一个字节的二进制对应,尽管包含8位,但是第一位始终是0,也就是128个
  • 单字节编码

ISO-8859-1

  • 字符集前128个字符与ASCII完全相同,后128个字符扩展增加了其他语言字符
  • 单字节编码

GB2312和GBK

  • 采用两个字节来编码一个中文汉字,涵盖了大部分常用的中文字符
  • GBK对GB2312进行扩展的中文字符集,它完全兼容GB2312,还对繁体和一些不常用的汉字和特殊字符进行扩展支持

UNICODE

  • 采用两个字节保存编码,前256个字符与ISO-8859-1是完全统一的,只不过他的第一个字节数字为0,它包含世界上大多数国家的大多数语言文字和字符

UTF-8

  • 对于0~127的ASCII字符,UTF-8采用一个字节表示,并且编码和ASCII是一样的,如果UNICODE是在0X0080和0x00FF之间的字符,UTF-8则用两个字节表示,如果UNICODE是在0X0800和0XFFF之间的字符,对应的UTF-8则采用3个字节

java语言

  • Java语言内部采用Unicode字符集来表示字符,一旦与外界的程序打交道就会存在一个字符转换的过程
  • 对于Java Web应用程序,客户端浏览器采用默认的字符集(通常是GBK),而Web容器对POST提交的数据采用ISO-8859-1的编码方式,数据在这些系统中穿梭很可能就会出现乱码的问题

处理中文乱码方式:

  • resp.setContentType(“text/html; charset=GBK”);//设置服务器给客户端响应的内容类型,指定编码方式解决返回给客户端中文乱码的问题(编码方式位GBK或者UTF-8)
  • req.setCharacterEncoding(“GBK”);//解决Post请求的中文乱码问题(编码方式位GBK或者UTF-8)
  • get解决方案需要修改server配置文件
    在这里插入图片描述

Servlet体系:

  • 总共3个类:Servlet接口,GenericServlet抽象类,HttpServlet抽象类

1.1 Servlet接口

  • init():初始化方法
  • getServletConfig():可以得到一个ServletConfig对象,利用这个参数可以得到初始化参数
  • service():servlet对于请求的一个响应
  • getServletInfo():返回servlet的相关信息
  • destroy():销毁Servlet。

1.2 GenericServlet 抽象类

  • 实现了Servlet接口方法的init()方法
  • 两种初始化操作(带参和不带参):
  • 重写父类两个init()方法时,只会调用带参的方法
  • 只有当只重写init()不带参的方法时,才会调用它
    public void init() throws ServletException
    init(ServletConfig config)

1.3 HttpServlet 抽象类

  • 实现了Servlet接口的service()方法。
  • 根据一定的条件分发到doGet()或者doPost()方法中。
  • 我们自定义自己的servlet就继承HttpServlet,再重写doGet(),doPost()方法即可。

1.4 ServletContext接口

  • 可以通过ServletConfig.getServletContext方法获得ServletContext对象。(获取上下文)
  • 1、Servlet对象之间可以通过ServletContext 对象来实现通讯:
context.setAttribute("name", "nic");  
String name = context.getAttribute("name");   
  • 2、获取初始化参数
获取初始化参数
String url = context.getInitParameter("url");

设置配置文件
<context-param>     
    <param-name>url</param-name>    
    <param-value>jdbc:mysql://localhost:3306/4g</param-value>     
</context-param>  
  • 3、用于Servlet转发:

1.5 ServletConfig接口

  • 在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
  • web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。
  • config的调用方法
1.getInitParameter(String name):
name 指定初始化参数名称的 String 
return 包含初始化参数值的 String 
  • 2、getInitParameterNames() 以string类型返回Enumeration接口对象
  • 3、getServletContext() 返回一个 ServletContext 对象
  • 4、getServletName() 返回

会话跟踪技术

cookie(在客户端内)

  • 定义:由服务器发送给客户端(浏览器)的小量信息
  • 作用:平时上网时都是使用无状态的HTTP协议传输出数据,这意味着客户端与服务端在数据传送完成后就会中断连接。这时我们就需要一个一直保持会话连接的机制。
  • 不能跨服务器,也不能跨域名、只能和自己的服务区对接(注意点)

原理:

  • 原理:客户端请求服务器时,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。而客户端浏览器会把Cookie保存起来。当浏览器再请求服务器时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器通过检查该Cookie来获取用户状态。

方法:

在javax.servlet.http.Cookie包中
添加cookie示例:
Cookie c = new Cookie("username","peter");
//新建一个Cookie对象
c.setMaxAge(24*60*60);                    
// 设置过期时间1天,以秒为单位
c.setMaxAge(0);
//  删除这个Cookie
response.addCookie(c);                    
//  保存cookie到客户端
Cookie[] cs = request.getCookies();//获取请求中的Cookie
// 获取Cookie数组
for(Cookie c : cs) 通过for来遍历

cookie应用方面:

  • 帮助网站实现提示客户端计算机上次访问网站的时间
  • 使用cookie基础密码

cookie生命周期

  • 可以通过setMaxAge设置生命周期
  • 默认情况下,通过getMaxAge()获取值为-1,表示关闭浏览器时,cookie失效
  • 与之对应的是持久Cookie(持久是相对而言的)

Session(会话)(在服务器端):

定义:

  • 有始有终的一系列动作或消息(打电话到挂断电话)

实现原理

  • 底层依赖于Cookie,把session存放在服务器端的缓存中,每次识别session对象,都有专门的session ID
  • 由于Cookie可以被人为禁用,必须有其他机制在cookie被禁用时,仍然可以把session ID传回服务器
禁用cookie后的使用方法:URL重写
  • 附加在URL路径后面
  • ①作为URL路径的附加信息
  • ②作为查询字符串附加在URL后面
// 两层含义:第一层当没有session对象时,创建一个session对象
// 如果有了session对象,则直接使用
HttpSession session = request.getSession(true);
session.getId() // 获取sessionID
// 设置信息,前面是对象,后面是信息
session.setAttribute("username", "kelly");
// 获取对象信息
session.getAttribute("username");
// 利用链接查看session 
out.println("<br>" + "<a href=" + "ShowSession" + ">查看session</a>");

Servlet跳转

  • 客户端跳转-------请求重定向
  • 服务器端跳转-------请求转发
//获取类型
String type = request.getParameter("type");
//
if (type.equals("redirect")) 
{
     response.sendRedirect("RequestServlet2?type=" + type);
}else {
	RequestDispatcher rd = request.getRequestDispatcher("RequestServlet2");
	//使用request获取委派对象,URL可以以‘/’开头,也可以不以‘/’开头
	//使用上下文获取委派对象时,URL一定要以'/'开头
	
	//包含,客户端得到的返回信息是两个文件共同输出的结果
	rd.include(request, response);
	//控制权的完全转向,客户端得到的返回信息是来自于转向后文件的输出
	//rd.forward(request, response);
}

两个跳转方式的区别:

  • 第一点:
调用HttpServletResponse.sendRedirect方法重定向的访问后,由初始的URL地址变成重定向的目标URL;
调用RequestDispatcher.forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
  • 第二点:
RequestDispatcher.forward方法共享相同的request对象和response对象, 它们属于同一个访问请求和响应过程;
而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。
所以sendRedirect重定向两个servlet之间不能接收到信息,但通过session会话是可以共享的

数据共享:

  • 在不同页面或者用户之间共享数据
  • 服务器跳转页面间的数据共享

Servlet3.0实现文件上传

• 标识Servlet支持文件上传 
• @MultipartConfig注解

• 通过表单file控件(<input type="file" name="uploadfile">)的名字直接获取Part对象 
• Part part = request.getPart("uploadfile");

• 获取提交的文件的文件名称 
• part.getSubmittedFileName(); 

• 将文件保存到制定的本地路径
• part.write(savePath);1)读取打开指定文件 
• FileInputStream fis = new FileInputStream(filepath); 
• (2)根据下载的文件类型设定响应头的ContentType
• response.setContentType(mimetype); 
• (3)设定浏览器对于文件的打开方式Content-disposition
• response.setHeader("Content-disposition","inline");
• (4)获取response对象的输出流,将读取到的文件字节返回至客户端 
• while(fis.read(in, 0, in.length) != -1) { 
• response.getOutputStream().write(in);}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值