java Web Servlet
2021/7/1 14:23:34
本文主要是介绍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)
通过问号直接传值
- 默认表单请求方式(method)
- 用?分割、参数用&连接。
- URL?参数名1=值&参数名2=值&…
- 从这点看来,GET请求的地址栏会改变,可以会暴露信息,安全性没有post高
Post方法请求
-
- POST(数据量大,安全性要求高)
• 通过单独的套接字连接发送包数据
• 完整的事务对客户是不可见的
• 与GET方法比较起来较慢
- POST(数据量大,安全性要求高)
- html文件应放在WebContent文件下(当然可以通过相对路径或者绝对路径进行切换)
- web.xml文件应放在WEB-INF下,并且配置servlet时需要注意:
-
- servlet-class:是运行java文件的路径:com.org.InputServlet
-
- servlet-name:是需要在servlet-mapping确认你调用他的名字
-
- url-pattern:调用某个java文件(调用名)
- POST请求会把请求的数据放置在HTTP请求包的包体中。
- 我们可以先通过调用html文件,然后利用post请求:
- 然后提交数据:
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);}
这篇关于java Web Servlet的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南