前三章内容


为什么使用Servlet & JSP

我们只说明要点,因为第一章的内容重点并不是Servlet与JSP。此后我们将重点介绍这两种技术,而不是现在。

要点:

  • HTTP代表超文本传输协议(HyperText Transfer Protocol),这是Web上使用的网络协议。HTTP运行在TCP/IP之上。
  • HTTP使用一种请求/响应模型,客户做出一个HTTP请求,Web服务器返回一个HTTP响应,再由浏览器(根据响应内容类型)确定如何进行处理。
  • 如果来自服务器的响应是一个HTML页面,就会把HTML增加到HTTP响应中。
  • HTTP请求包括请求URL(客户想要访问的资源)、HTTP方法(GET、POST等),以及(可选)表单参数数据(也称为”查询串”)。
  • HTTP响应包括一个状态码、内容类型(也称为MIME类型),以及响应的实际内容(HTML、图像等)。
  • GET请求会把表单数据追加到URL的最后。
  • POST请求将表单数据包括在请求的体中。
  • MIME类型告诉浏览器要接收哪一类数据,一遍浏览器知道如何加以处理(呈现HTML、显示图片、播放音乐等)。
  • URL代表同意资源定位符(Uniform Resource Locator)。Web上的每个资源都有自己的唯一地址,都采用这种URL格式。首先是一个协议,然后是服务器名以及一个可选的端口号,再后面通常是一个特定的路径和资源名。如果URL对应一个GET请求,那么它还可能包含一个可选的查询串。
  • Web服务器擅长提供静态HTML页面,但是如果需要页面中有动态创建(如当前时间),就需要某种辅助应用于服务器协作。如果不用Java术语来说,这些辅助应用(大多数用Perl编写)通常称为CGI,这代表公共网关接口(Common Gateway Interface)。
  • 把HTML放在println()语句中的做法很糟糕,也很容易出错,不过JSP可以解决这个问题,它允许把Java放在HTML页面中,而不是把HTML放在JAVA代码中。

Web 应用体系结构

高层Web应用体系结构

  1. 对于每一种HTTP方法(如get、post、head等),描述该方法的用途,以及该HTTP方法协议的技术特性,并列出客户(通常是一个Web浏览器)会因为哪些原因使用这种方法,明确对应这种HTTP方法的相应HttpServlet方法。
  2. 描述Servlet生命周期的作用和实践序列:
    1. servlet类的加载
    2. servlet实例化
    3. 调用init方法
    4. 调用service方法
    5. 调用destroy方法
  3. 构建Web应用的文件和目录结构,可能包含:
    1. 静态内容
    2. JSP页面
    3. servlet类
    4. 部署描述文件
    5. 标记库
    6. JAR文件
    7. Java类文件并描述如何保护资源文件避免HTTP访问
  4. 描述一下各个部署描述文件元素的作用和语义:
    1. servlet实例
    2. servlet名
    3. servlet类
    4. servlet初始化参数
    5. URL与servlet的映射

什么是容器?
Servlet没有main()方法。它们受控于另一个Java应用,这个Java应用称为容器(比如Tomcat,PS:Apache是Web服务器。这两者是有区别的)。

容器能什么?

  1. 通信支持,无需我们自己建立ServerSocket、监听端口、创建流等。我们只需要实现自己的业务逻辑即可。
  2. 生命周期管理,容器控制着servlet的生与死。它会负责加载类、实例化和初始化servlet、调用servlet方法,并使servlet实例能够被垃圾回收。
  3. 多线程支持,容器会自动地为它接收每个servlet请求创建一个新的线程。针对客户的请求,如果servlet已经运行完相应的HTTP服务方法,这个线程就会死掉。这并不是说不用考虑线程安全,还是会遇到同步问题
  4. 声明方式实现安全,利用容器,可以使用XML部署描述文件来配置(和修改)安全性,而不必将其硬编码写到servlet(或其他)类代码中。
  5. JSP支持,容器负责把JSP代码翻译成真正的Java。

容器如何处理请求?

  1. 用户点击一个URL链接
  2. 容器创建两个对象:HttpServletResponse、HttpServletRequest对象
  3. 容器根据URL找到正确的servlet,并将响应和请求对象传递给servlet线程
  4. 容器调用servlet的service()方法,根据不同的请求调用不同的方法(如doGet()、doPost()方法)
  5. doGet()、doPost()做完事情后,将生成一个动态页面填入到HttpServletResponse对象中
  6. 线程结束,容器将响应对象转换为一个HTTP响应,把它发回给客户,然后删除请求和响应对象。

MVC模式

  1. M=model模型
  2. V=view视图
  3. C=console控制器

MVC 迷你教程

Web 应用部署

  1. 构建一个Web应用的文件和目录结构可能包含

    1. 静态内容
    2. JSP页面
    3. servlet类
    4. 部署描述文件
    5. 标记库
    6. JAR文件
    7. Java类文件
  2. 描述一下各个部署描述文件元素的作用和语义:
    1. error-page
    2. init-param
    3. mime-mapping
    4. servlet
    5. servlet-class
    6. servlet-mapping
    7. servlet-name
    8. welcome-file
  3. 为以下各个部署描述文件元素构造正确的结构
    1. error-page
    2. init-param
    3. mime-mapping
    4. servlet
    5. servlet-class
    6. servlet-name
    7. welcome-file

构建一个真正的Web应用

我们的4大步骤:

  1. 分析用户的视图,以及高层体系结构
  2. 创建用于开发这个项目的开发环境
  3. 创建用于部署这个项目的部署环境
  4. 对Web应用的各个主键完成的开发和测试(迭代式的开发和测试)

用户视图:

开发环境

部署环境

构建应用的路线图

  1. 构建和测试用户最初请求的HTML表单。
  2. 构建控制器servlet第一个版本,并且用HTML表单测试这个控制器。这个版本通过HTML表单来调用,并打印出它接收的参数。
  3. 为专家/模型类构建一个测试类,然后构建并测试专家/模型类本身。
  4. 把servlet升级到第2版。这个版本增加了一个功能,可以调用模型类来得到啤酒建议。
  5. 构建JSP,把servlet升级到第3版本(再增加一个功能,可以把表示分派到JSP完成),然后再测试整个应用。

版本1

前端代码:

<!DOCTYPE html>
<html><head><title>form.html</title></head><body><h1 align="center">Beer Selection Page</h1><form action="SelectBeer.do" method="post"><span>Select beer characteristics</span><br/><span>Color:</span><select name="color" size="1"><option value="light">light</option><option value="amber">amber</option><option value="brown">brown</option><option value="dark">dark</option></select><br/><br/><br/><center><input type="submit" value="Submit"></center></form></body>
</html>

将其放至部署环境中,并且启动tomcat。(启动tomcat可以进入到tomcat的/bin目录下,启动start.bat,以上都是通过DOS来操作)

这样,我们的网页就放在服务器上面了。可以试试局域网能够访问你的网站,不过记住,让局域网的8080端口处于可以转发的状态

控制器servlet的第1版(注意:如果报GBK错,就把注释去掉)

servlet代码:

package com.example.web;//servlet接口的包
import javax.servlet.*;
//httpservlet的包
import javax.servlet.http.*;
//io流的包
import java.io.*;//几乎大部分的servlet都需要继承HttpServlet类
public class BeerSelect extends HttpServlet {//重写了HttpServlet的doPost方法public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {//这个方法来自ServletResponse接口response.setContentType("text/html");//获取响应的输出流PrintWriter out = response.getWriter();out.println("Beer Selection Advice<br/>");//这个方法来自于ServletRequest接口String color = request.getParameter("color");out.println("<br/>Got beer color "+ color);}}

编写完代码后,进行编译和连接,并将其放置开发环境和部署环境的classes目录下。

上图只是把class放置开发环境中,还需要复制一份class到tomcat的WEB-INF中(注意命令中的分号有2个)。

创建DD放至开发环境的/beerV1/etc/目录下(注意:如果报错就把注释去掉)

<!-- 这段照着敲就行了,以后再知道意思 -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><servlet><servlet-name>Ch3 Beer</servlet-name><servlet-class>com.example.web.BeerSelect</servlet-class></servlet><servlet-mapping><servlet-name>Ch3 Beer</servlet-name><url-pattern>/SelectBeer.do</url-pattern></servlet-mapping></web-app>

将上面的xml文件复制到部署环境。

重启tomcat:

点击submit后:

至此,第1版完成。

我们发现在servlet中处理表单,这样不是很好,所以我们出现第2版

工具代码如下:

import java.lang.*;
import java.util.*;public class BeerExpert{public List<String> getBrands(String color){List<String> list = new ArrayList<String>();if(color.equals("light")){list.add("Jail Pale Ale");list.add("Gout Stout");}return list;}
}

第2版servlet代码:

package com.example.web;import com.example.model.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;public class BeerSelect extends HttpServlet {public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {String color = request.getParameter("color");BeerExpert be = new BeerExpert();List<String> result = be.getBrands(color);response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("Beer Selection Advice<br/>");Iterator it = result.iterator();while(it.hasNext()){out.print("<br/>try: "+it.next());}}}

编译连接后,将classes的文件复制到部署环境下,并且运行tomcat。

成功!

这里我们发现,视图部分由servlet来写又太麻烦了!于是第3版本出来了。

第3版视图result.jsp:

<%@ page import="java.util.*" %><!DOCTYPE html>
<html>
<head><title></title>
</head>
<body><h1 align="center">Beer Recommendations JSP</h1><p><%List<String> styles = (List<String>) request.getAttribute("styles");Iterator it = styles.iterator();while(it.hasNext()){out.print("<br/>try: "+it.next());}%></body>
</html>

将其放置开发环境的web目录下,并复制到部署环境的WEB-INF中。

第3版BeerSelect:

package com.example.web;import com.example.model.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;public class BeerSelect extends HttpServlet {public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {String color = request.getParameter("color");BeerExpert be = new BeerExpert();List<String> result = be.getBrands(color);request.setAttribute("styles",result);RequestDispatcher view = request.getRequestDispatcher("result.jsp");view.forward(request, response);}
}

编译连接后,将其放置部署环境的classes的相关目录下。

显示结果如下:

抓包分析发现,并无发现有3**的转发状态,也就是说JSP和servlet之间的转发,用户是不可见的。


需要学习的内容还很多。基础比一切都重要,无论你是否会最新的技术。有基础,必定可以有一番成就。

Head First JSP---随笔一相关推荐

  1. jsp随笔-工作使用-直播功能

    1.状态功能 <div class="form-group"> <label for="" class="col-md-3 cont ...

  2. Cocos2d-x 屏幕适配新解(比较全面比较详细)

    黑米GameDev街区 『 不要让任何事情成为你不去学习的理由!』 -Himi Home About Himi Himi's Book 街区须知 资源/技术群 订阅本站 主页 > Cocos2d ...

  3. 百度直播的海量用户实时消息系统架构演进实践

    1.引言 一套完整的直播系统核心功能有两个: 1)实时音视频的推拉流: 2)直播间消息流的收发(包括聊天消息.弹幕.指令等). 本文主要分享的是百度直播的消息系统的架构设计实践和演进过程. 实际上:直 ...

  4. 随笔-jsp 利用jstl标签分页

    ${pager.totalpage}是总页数 <c:forEach begin="1" end="${pager.totalpage}" var=&quo ...

  5. JSP/Servlet 工作原理

    Servlet Servlet Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器. Servlet 运行在 Ser ...

  6. Jmeter_初步认识随笔

    Jmeter_初步认识随笔 1. 简介 Apache JMeter是100%纯java桌面应用程序,被设计用来测试客户端/服务器结构的软件(例如web应用程序).它可以用来测试包括基于静态和动态资源程 ...

  7. servlet向ajax传递数据库,一、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)...

    背景: 目前业界很流行的MVC(model-view-control)开发模式,理解为 模型是Bean, 视图是 Html/Jsp, 控制是Servlet, 关联数据库的Dao web的运行机制: 数 ...

  8. JAVA查询数据库并显示jsp_java servlet数据库查询并将数据显示到jsp页面

    需要的jar包:mysql-connector-java.jar build path只是个jar包的引用,部署的时候想不丢包最好还是手动拷贝到对应项目的lib文件下. 在try{}中定义的变量为局部 ...

  9. 深度学习Spring5底层原理(黑马学习随笔)

    学习随笔简介 跟随着黑马满老师的<黑马程序员Spring视频教程,全面深度讲解spring5底层原理>学习,视频教程地址:黑马程序员Spring视频教程,全面深度讲解spring5底层原理 ...

  10. 随笔备忘记录-UI自动化测试-操作配置文件、封装公共类

    随便写点东西,有的是网上借鉴,有的是自己体会,总之都是根据自己的需求进行优化的一些东西,随笔备忘录 python3配置文件的增删改查等操作可以使用内置的ConfigParser模块,需要一个配置文件去 ...

最新文章

  1. BZOJ3782 上学路线 【dp + Lucas + CRT】
  2. Nature调查:6%中国科研人年薪超50万元!
  3. Nature news: 未来40年,DNA测序将走向何方?
  4. 使用MySQL自带工具mysqlhotcopy快速备份mysql数据库
  5. python集合中的元素是否可以重复_python中集合中的元素是否可以重复
  6. cuda win10安装
  7. 深入探究Spark -- Cluster Manger部署(最常用为YARN实现Task Scheduler)
  8. 去超市一定要存包吗_去东京一定要去的富士河口湖
  9. python x y 定位点击,python - Python找到一个点相对于其他四个已知点的x,y位置 - 堆栈内存溢出...
  10. 是否可以从头来过——时间旅行为什么不可能
  11. GIS | 坐标系统与地图投影
  12. Adobe LiveCycle Designer 报表设计器
  13. 2022-2027年中国重卡行业市场深度分析及投资战略规划报告
  14. uni-app H5实现公众号微信授权登入遇到的问题(前端)
  15. 【黑马程序员pink老师前端】HTML
  16. java workflow 教程_学习(史帝芬)osworkflow入门教程后的一些体会
  17. 腾讯云图 数据源 api
  18. 精选免费论文翻译工具
  19. 微信小程序 动态设置背景
  20. 作业1.老狼几点了。凌晨,上午,下午,晚上。

热门文章

  1. hdu 1050 Moving Tables
  2. ssh远程登录执行shell脚本,找不到jps
  3. bootstrap-datetimepicker bootstrap-datepicker bootstrap-timepicker 时间插件
  4. 【HNOI模拟By YMD】move
  5. PHP 设计模式 笔记与总结(8)策略模式
  6. mysql.user表中Host为%的含义
  7. 遇到automation服务器不能创建对象...
  8. Go版本升级后编译出错:Load redeclared in this block
  9. Python学习笔记:网络编程
  10. 高并发01_synchronized