Servlet 简介

Servlet 是什么?

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

servlet 的优势:

  • 性能明显更好。
  • Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
  • Servlet 是独立于平台的,因为它们是用 Java 编写的。
  • 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
  • Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

servlet 的架构:

servlet 的配置对象

一 对象获取方式

方式一:

声明一个成员变量保存该对象

通过init方法获取ServletConfig对象

public class Demo01 extends HttpServlet {// 声明一个成员变量保存该对象private ServletConfig config;//给成员变量赋值@Overridepublic void init(ServletConfig config) throws ServletException {// TODO Auto-generated method stubsuper.init(config);this.config=config;}}

方式二:

直接调用父类的getServletConfig()方法

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {(直接调用父类的方法)ServletConfig config2 = this.getServletConfig();String value2 = config2.getInitParameter("weige");System.out.println(value2);}

作用:

获取Servlet的配置信息 此对象是每个Servlet 都具有的;可通过该对象获取servlet的配置信息

private void fun1() {System.out.println(this.config);//可以通过ServletConfig对象获取Servlet的配置信息String value = this.config.getInitParameter("wanglong");System.out.println(value);//获取多个配置信息Enumeration<String> names = this.config.getInitParameterNames();while (names.hasMoreElements()) {System.out.println(names.nextElement());}

servlet 的域对象

servletContext :作用范围最大的域对象,作用域整个工程项目,并且此对象是个单例对象;

作用:可以利用单例的特点用来传值.该对象内部维护了一个map集合,而且所有的域对象内部都是维护了一个map集合;

1.存值取值  setAttribute  getAttribute

2.获取全局配置信息

3.可以获取服务器上所有的资源的真实路径  getrealpath()

4.可以进行请求转发

该对象的获取方法

方式一: 通过ServletConfig 对象获取

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext context = this.getServletConfig().getServletContext();//向context 保存一个值context.setAttribute("username", "wanglong");}

方式二:通过父类获取 该方法在ServletConfig 接口中

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext context = this.getServletContext();context.setAttribute("user", "我是王老五");//获取ServletContext 配置信息String value = context.getInitParameter("kuner");System.out.println(value);}

取值:

public class Demo03 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//取出Context域中的值ServletContext context = this.getServletConfig().getServletContext();Object obj = context.getAttribute("username");System.out.println(obj);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

该域对象作用于整个工程,因此在该工程的任意的一个servlet 都可以获取到设置的值.

2.获取服务器上的资源路径

如上图在工程下不同的位置新建 a b c 三个properties文件

public class Demo04 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//fun1();//读取b and c.properties文件String path2 = this.getServletContext().getRealPath("/WEB-INF/classes/com/lanou3g/b.properties");String path3 = this.getServletContext().getRealPath("/WEB-INF/c.properties");System.out.println(path2);System.out.println(path3);//读文件FileInputStream fis2 = new FileInputStream(path2);Properties properties2 = new Properties();properties2.load(fis2);   FileInputStream fis3 = new FileInputStream(path3);Properties properties3 = new Properties();properties3.load(fis3);System.out.println(properties2.getProperty("key"));System.out.println(properties3.getProperty("key"));}private void fun1() throws FileNotFoundException, IOException {//读取a.properties 文件//参数路径是相对于工程名String path = this.getServletContext().getRealPath("/WEB-INF/classes/a.properties");System.out.println(path);//读文件FileInputStream fis = new FileInputStream(path);Properties properties = new Properties();properties.load(fis);System.out.println(properties.getProperty("key"));}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

4.请求转发

1.用户只发起了一次请求

2.用户请求是并不知道 网站内部做了什么

public class Demo05 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("借点钱,萧峰兄弟");System.out.println("老兄:我没有 ,你去找坤儿");//通过context对象获取请求转发器//转发: 请求转发只能是站内转发(本工程) //并且转发的路径是相对于你的工程RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/demo06");//转发器//请求转发dispatcher.forward(request, response);System.out.println("钱借到了,人傻好办事");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
public class Demo06 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("我是坤儿,我有随便花");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

打印结果如下:

可以看出demo05 的需求被转发到 demo06 但是浏览器上并没有跳转到demo06;

响应 response

响应行 响应的状态码  200  http协议 1.1

响应头  告诉浏览器我要做什么操作 ?

告诉浏览器你需要使用什么编码格式来解析我的响应

响应体  响应浏览器的内容

响应头设置应用

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//Tomcat默认的编码格式是 ISO-8859-1 不支持中文;/*response.setCharacterEncoding("utf-8");//设置响应头告诉浏览器你需要使用什么编码格式来解析数据response.setHeader("Content-type", "text/html;character=UTF-8");*///合并写法 (写Servlet 是第一句先写编码格式)response.setContentType("text/html;charset=UTF-8");//接到请求后向浏览器写个字符串//通过响应对象中的流对象回写//注意:;如果你当前在servlet中使用的字符流//那么就不能在写字节流了PrintWriter writer = response.getWriter();writer.write("wanglong你好啊");}

响应浏览器内容 下载一张图片;

添加一张图片到工程内;

package com.lanou3g;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Path;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/** 从服务器中下载图片*获取服务器的图片路径*读文件*通过respose 获取字节流回写**告诉浏览器(添加响应头)*1.我给的这个图片是下载用的*2.文件名 文件类型* content-disposition attachment;filename=content-type image/jpeg/png...*/
public class Demo08 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String path = this.getServletContext().getRealPath("/WEB-INF/classes/宝宝心里苦.png");File file = new File(path);String name = file.getName();//修改文件名的编码格式name = new String(name.getBytes(), "iso-8859-1");//添加响应头response.setHeader("content-disposition", "attachment;filename="+name);response.setHeader("content-type", "image/png");//读文件FileInputStream fis = new FileInputStream(path);ServletOutputStream out = response.getOutputStream();int len = 0;byte [] b = new byte [1024];while ((len = fis.read(b))!=-1) {out.write(b, 0, len);}fis.close();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

请求重定向

public class Demo09 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//fun1(response);//3秒后 跳转一个页面//添加一个刷新头//response.setHeader("refresh", "3;url=/sh-web-02/demo10");response.setIntHeader("refresh", 1);PrintWriter writer = response.getWriter();writer.write(Math.random()+"  ");}private void fun1(HttpServletResponse response) {System.out.println("我借钱");System.out.println("你去找demo10");//添加请求重定向  响应头//参数二是重定向的 路径(站内站外网址都可以)  站内路径需要带上工程名//response.setHeader("location", "/sh-web-02/demo10");response.setHeader("location", "http://baidu.com");//添加状态码302response.setStatus(302);System.out.println("借完了");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
public class Demo10 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("我是demo10---找我借钱吗,门都没有");}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

请求重定向

注意: 请求重定向是两次请求

第二次请求是接到第一次请求的响应头之后发生的 可以看到浏览器中denmo09跳转到了demo10

请求 request

请求中的方法

     //获取请求的方式String method = request.getMethod();System.out.println(method);//获取请求的URLStringBuffer requestURL = request.getRequestURL();System.out.println(requestURL);//获取请求的URIString requestURI = request.getRequestURI();System.out.println(requestURI);//获取请求网址的相对路径String contextPath = request.getContextPath();System.out.println(contextPath);

使用 Servlet 读取表单数据 并连接访问数据库

getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取表单提交的数据//通过表单中 name属性 来获取输入框中的数据String username = request.getParameter("username");String password = request.getParameter("password");System.out.println(username);System.out.println(password);//连接数据库查询Connection conn = null;PreparedStatement statement  = null;ResultSet resultSet = null;String sql = "select * from user where username=? and password =?";try {conn = JDBCUtil.getConnection();statement = conn.prepareStatement(sql);statement.setObject(1, username);statement.setObject(2, password);resultSet = statement.executeQuery();if (resultSet.next()) {System.out.println("登录成功 欢迎" + username);}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {//关闭资源JDBCUtil.closeAll(resultSet, statement, conn);}}

Java基础学习之Servlet 运用学习相关推荐

  1. 【Java基础】swing-图形界面学习(下)

    就是个人学习的笔记,按照下面的Demo一个一个复制粘贴跑起来大概就会使用Swing了,建议先从上半部分开始看 上半部分 [Java基础]swing-图形界面学习(上) 八.菜单 GUI的菜单分为 菜单 ...

  2. 【Java基础】swing-图形界面学习(上)

    就是个人学习的笔记,按照下面的Demo一个一个复制粘贴跑起来大概就会使用Swing了 [Java基础]swing-图形界面学习(下) 文章目录 Swing 一.快速开始 练习-在上次关闭位置启动窗口 ...

  3. java基础的第二轮快速学习!day03

    //练习:输入计算两个数的和 Scanner input=new Scanner(System.in); System.out.print("请输入第一个数"); int num= ...

  4. Java基础第一讲:Java的故事和Java编程环境搭建

    { Android学习指南 } 适于自学的ANDORID学习指南,基于ANDROID 2.2.2.3.3及3.0版本讲解 <ANDROID学习指南>目录 RSS Java基础第一讲:Jav ...

  5. Java基础教程-刘刚-专题视频课程

    Java基础教程-2704人已学习 课程介绍         Java基础教程是一套入门Java开发语言的课程,它是由浅入深的介绍Java基础内容,包括Java介绍.基本类型及运算符.控制执行流程.字 ...

  6. 第一阶段>>>Java基础进阶 OOP/Reflect/注解/IO流/API核心

    目录 >>>java基础01-结构以及类型 >>>java基础02-初识数组 >>>java基础03-面向对象OOP >>>ja ...

  7. 如何快速打好Java基础?

    私下里,很多很多小伙伴隔三差五就问我:"二哥,怎么快速打好 Java 基础啊?能把你的经验分享一些吗?"每次我都花很长时间去回复,直到他们满意.但这样做实在是太累了,就在 GitC ...

  8. java基础不好框架能学会吗_转行Java能学会吗?零基础学习Java的学习路线

    Java的跨平台性.通用性.安全性.高效性决定了这门语言在未来10年都会是最热门的语言之一.Java技术的安全性和平台移植性足够让他应用到不同的领域,它的工作需求足够大,现实一点来说即使Java濒临o ...

  9. java基础知识点_零基础学习Java语言,各个阶段需要掌握的知识点

    随社会的脚步的不断发展,Java技术在不断的与时俱进,这也是Java一直长盛不衰的原因之一.Java技术的学习,永远没有早晚之分,技不压身,对于21世纪的我们80后,90后,甚至00后,尤其适用! 那 ...

最新文章

  1. centoros 环境安装
  2. JAVA写出来的塔防能有多好玩?......真香!
  3. 一张图看懂数据库十年大格局!
  4. vuex 编译项目_俺咋能看懂公司前端项目?
  5. GoAhead 2.5 Web Server 网页ROM化的改进
  6. Python实现快速的风格迁移
  7. 在c语言程序中无论是整数还是实数,C语言基础题及参考答案
  8. AdamOptimizer和随机梯度下降法SGD的区别
  9. APP设计灵感|空白页空状态界面也可以这么设计
  10. python ggplot_python数据可视化系列---谁是ggplot2的更好python实现
  11. A股收盘:深证区块链50指数跌3.80%,爱迪尔等9股涨停
  12. linux 添加隐藏wi-fi,隐藏wifi怎么设置?
  13. v4l2API无法执行VIDIOC_DQBUF的问题
  14. NTOJ-14-会场安排问题(贪心算法)
  15. 上海世博会物联网技术应用
  16. VirtualBox的下载与安装
  17. [计算机数值分析]四阶龙格-库塔经典格式解常微分方程的初值问题
  18. 开发步骤_APP开发和上市的步骤
  19. 论文研读 —— 6. ImageNet Classification with Deep Convolutional Neural Networks (1/3)
  20. ALM系统开发工程师职业发展调查

热门文章

  1. Android和win10的融合,微软Windows10更新版亮相 更好融合iOS、Android系统
  2. JQuery | JQuery语言 | JQuery基础 | JQuery语言基础
  3. 湖南多校对抗赛(2015.03.28) H SG Value
  4. 用NSIS制作安装文件
  5. 数仓开发之DWD层(二)
  6. Ceph-CephFS部署
  7. 浅谈企业拥有门户网站的重要性
  8. 21款超赞的手写英文字体,总有一款适合你
  9. SQL Server之菜鸟入坑学习练习01
  10. Fisher判别分析