在java中进行WEB编程的基础概念与工具
前言
在上一课中,我们使用了java socket来基于TCP/IP与流进行网络编程。这节课的重点内容HTTP协议它与TCP/IP协议同样是应用层协议。但不同的是HTTP是基于TCP/IP协议之上的应用层协议,相关其它的常见应用层协议还有:FTP(文件传输),SMTP(邮件传输)。HTTP基于TCP/IP
这是第一个重点。
第二个重点是,HTTP协议所完成的是B(Browser浏览器)/S(Server)架构,也就是说咱们经常通过浏览器访问网站的结构。而TCP/IP则是C(Client)/S(Server)架构。咱们上节课所开发的聊天工具就是CS结构。是最底层的应用层协议
,针对的是各种二进制数据的直接处理。而HTTP协议针对的是超文本
,又称之为富文本
。简而言之就是比我们的聊天工具传输的数据要更加复杂,而且是针对网页的用户界面范式。
第三个重点是,HTTP也支持C/S架构,原因是它支持WEB socket,异步请求等等。
使用JAVA SERVLET进行WEB开发
TOMCAT容器
在使用JAVA进行WEB开发之前,我们需要了解我们到目前为止的第二个容器,第一个容器是Spring,它帮助我们管理我们的java类。第二个容器是TOMCAT,它帮助我们高效的处理解析与响应WEB请求。
- 线程池)它帮助我们管理服务器连接池,使得我们服务器高效的相应客户端请求。
- 连接器)它帮助我们封装高效的IO模型响应客户端请求。
- 容器)包装解析请求&响应内容。通过支持压缩算法来加快我们的网络传输效率。。。等等等。
所以虽然都叫做容器,但是他们的作用领域大大不同,要学会区分。如果没有TOMCAT的话,我们当然也可以自己实现的,通过TCP/IP协议。只不过上面的这些问题你要怎么处理而已。
下载
打开tomcat官网下载页,如果是mac linux等需要下载源码包安装,windows下载zip。下载完成后解压出来即可。
目录解释
bin
- bin目录下主要是脚本,.bat结尾是windows,.sh是linux下的。catalina是核心脚本。startup,shutdown主要用于启动和关闭,正常情况下你现在就直接可以执行它们了。需要注意的是windows最好用命令行工具启动它。方便查看日志。
- 首先进入cmd,或者直接右击目录空白处选择在终端打开。
- 当我们执行这个./startup脚本
- 需要注意的是,在日志内容的最后会告诉我们每一个项目有没有加载完成,以及最后的容器启动成功与否
conf
- conf下最主要的是server.xml,比如如果是默认配置,它监听的是8080端口。
- 然后执行start脚本等它启动完成后,你可以打开任意浏览器输入localhost:8080 or 127.0.0.1:8080,来访问tomcat的主页。
- web.xml是tomcat的核心中的核心,未来我们的web项目中也要使用到这个web.xml文件。他所有的基础处理都从org.apache.catalina.servlets.DefaultServlet开始,就是在文件中配置的。关于什么是Servlet后面会提到。
webapps
- 上面访问的内容则是webapps\ROOT\目录下的index.jsp。所以不难理解webapp下面就是我们应该存放的我们一个一个的不同的项目。多个项目多个文件夹区分。而ROOT是默认访问的项目。如果要访问manager有两种方式。
- 点击刚才页面中的Manager App
- 或者直接输入htpp://localhost:8080/manager,所以对于tomcat而言,IP:端口/后接的第一个名字,就是webapp下的应用名字。至于为什么自动访问了index页面,是在web.xml中通过welcome-file配置了欢迎页面,所以只需要输入项目名(在web开发中又称之为上下文)
- 当然了manager属于管理员界面,需要设定用户名密码。在conf/tomcat-users文件最下面。设定账户密码之前先了解一下角色
- manager-gui 允许访问HTML GUI和状态页,manager-script允许访问HTTP API和状态页—manager-jmx允许访问JMX代理和状态页manager-status—只允许访问状态页
拉到最下面它设置用户的原始内容是:
<!-- <role rolename="tomcat"/> <role rolename="role1"/> <user username="tomcat" password="<must-be-changed>" roles="tomcat"/> <user username="both" password="<must-be-changed>" roles="tomcat,role1"/> <user username="role1" password="<must-be-changed>" roles="role1"/> -->
取消注释后修改为(rolename就是tomcat的角色),user 标签中除了设置用户名密码,还有所拥有的权限集合。
<role rolename=“manager-jmx”/> <role rolename=“manager-status”/> <role rolename=“admin-gui”/> <role rolename=“admin-script”/> <role rolename=“manager-gui”/> <user username=“admin” password=“admin” roles=“manager-gui,manager-script,manager-jmx,manager->status,admin-gui,admin-script”/>
- 最终在这个url下的页面中我们可以看到所有的项目,以及操作它们
lib
这个目录下的jar包要尽可能的熟悉,除catalina,tomcat开头的其它jar包,都将有可能会与你项目中的jar包产生冲突。请记住,当你使用tomcat容器加载你的应用时,如果启动时发现:
- java.lang.ClassNotFoundException 找不到类,重复了不知道用哪个。
- java.lang.NoSuchMethodError 找不到具体方法、你的B类中有这个方法,但是它加载的同名A没有。举例:你们都依赖了不同的第三方包但是版本不同。
- java.lang.NoSuchFieldError 没有这样的字段,同上。
- java.lang.LinkageError A依赖于B时,有多个不同的B,同上。
这些个错误类型时,意味着可能jar包冲突了。第一时间你应该寻找报错的类全限定名在哪个第三方依赖里。第二查看双方的版本,具体应该使用哪一个。
logs
日志目录下常用的三个日志文件,其它一般不怎么用。
- catalina,启动日志
- Catalina.out,第一记录你在程序中自行打印的日志,第二是报错日志,堆栈等等。
- localhost_access_log,所有请求过来的URL地址信息。一般防攻击的时候会经常使用到。可以查看对方频繁的在请求什么内容。
temp
这个简单,就是存放一些临时文件。比如缓存。
work
这个目录是用于你访问.jsp文件时,它将jsp编译为编译后的.class文件,但是jsp现在基本不用了,它类似于php可以在html网页里面写java代码,方便前端的开发。但是我们现在已经没有必要学了,主要是现在都是前后端分离的架构。其次我们这个系列的主讲内容就是java后端高并发架构。不参与任何
前端的开发。
HTTP协议
基础特性
- 它由网站或域名加上端口组成URL:http://www.xxx.com:8080/index.jsp,http://为协议前缀,www.xxx.com部分可以是ip、比如你在命令行ping www.baidu.com,你会发现它最终是在联通一个ip。端口8080部分一般默认是80,也就是说你的web应用如果是80端口来监听则不需要输入端口号。
- 不需要像TCP/IP那样一直保持连接状态。(无连接)
- 协议本身不存储任何数据,如果你第二次请求和第一次请求相关联,则需要重新传递消息。
请求
HTTP请求主要包含三个主要内容,请求行、请求头部、数据体。
- 请求行用于标识请求类型,最常用的有GET、POST。以及URL(就是上面说的)、协议版本(一般不需要自己指定)
- 请求头部涵盖的信息比较多,在入门时不需要过深的了解。
- 请求数据:GET请求的请求参数跟随在URL之后,比如http://www.xxx.com:8080/index.jsp?id=1&name=zhouxingchi&age=50,请求参数由?符号开始,后续的由&拼接。
- 请求数据:POST携带请求参数,以及数据体。
- 请求数据:首先GET请求和POST请求都是基于IP协议,本质上没有任何区别,第二是get请求能传输的数据量远远小于POST,第三POST请求不会显示的将参数显示在浏览器URL中,
相对安全
。第四GET请求能被浏览器缓存,POST请求是不可以的。 - 请求数据:POST请求通常用于提交数据,GET请求用于查询数据,因为get请求不允许携带请求体。
响应
和响应相对应,HTTP响应报文主要包含状态行、响应头部、数据体。
- 响应状态:
- 响应头:
- 响应内容(可以是任何内容的,关键在于数据被前端怎么处理):
因为响应的内容可以是一切内容,所以在响应头中,最最重要的头部字段就是Content-Type了:
- 如果是text/html,则等同于前后两端约定按html处理,后端返回也是html的内容。
- 如果是application/json则
Servlet
JAVA Servlet是SUN公司开发用于在JAVA中进行WEB开发的规范。是一种基础框架,它的全称是Server Applet服务器小程序。所有其它WEB开发框架都是基于Servlet来进行开发的。
TOMCAT原理根本上,就是专门用来装载Servlet的容器的。而且它本身也是使用java和Servlet来开发的,还记得上面看到的web.xml和org.apache.catalina.servlets.DefaultServlet吗,它通过它本身对Servlet的实现,转发到我们的Servlet上。不光是tomcat,任何用于java 的 web框架都是基于servlet。
Servlet tomcat 请求关系
需要注意的是,一旦你的应用以tomcat容器为基础运行,你的应用将不在拥有单独进程。拥有单独进程是的tomcat,而你所有的java类,最终都被tomcat解析和加载。这也就是为什么lib会有可能造成冲突。
Tomcat在接收请求和返回响应之间,调用了你的Servlet逻辑。而你在你自己的内部,仍然是需要web.xml+servlet作为基础进行开发。
到了Servlet这一层,我们只需要关注我们的业务,所有的请求报文都已经解析完成,所有的返回包装也都已经完成。我们只需要关注我们怎么处理请求和返回什么数据。
简单重新梳理一下,TOMCAT是用来监听端口,然后将解析过后的数据交给Servlet处理。最后返回数据。
编写第一个Servlet
我们先来一段简单的体验一下Servlet,请注意get和post请求的不同之处。如其名,它们分别用于接收get 和 post请求。
还记得网络编程中的流吗,请注意处理post请求时的调用方法,最重要的是不是就是获得输入流与输出流?也就是说到了这里我们完全可以理解为什么说http实际上就是基于TCP。只不过HTTP协议TOMCAT容器SERVLET框架的组合,帮助你完成了很多事情。让你只需要关注你的核心代码。
说白了就是Servlet必须通过继承HttpServlet标准的形式,而已,它本身不能完成任何web功能。他只是一个标准。但是通过你和tomcat容器遵循同一个标准,那么它就能够解析到你。仅此而已。
package lesson8;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//用于get请求时,获取URL中的参数
String username = req.getParameter("username");
//设置响应类型
resp.setContentType("text/plain");
PrintWriter pw = response.getWriter();
pw.println("你好");
pw.flush();
pw.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//用于post请求时,获取请求体中的全部报文流
ServletInputStream inputSteam = request.getInputStream();
//设置响应类型
resp.setContentType("text/plain");
PrintWriter pw = resp.getWriter();
pw.println("你好");
pw.flush();
pw.close();
}
web.xml的配置
web.xml文件是JAVA web应用程序的专有配置文件,核心就是配置Servlet。而tomcat(java web容器)通过加载我们的web.xml文件,来载入我们的容器。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 声明我们的Servlet名称以及类全限定名 -->
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>lesson8.HelloWorld</servlet-class>
</servlet>
<!-- 给我们的servlet指定一个url访问路径 -->
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/helloworld.do</url-pattern>
</servlet-mapping>
</web-app>
演示
由于篇幅可能过长,我们下节课教大家部署测试,以及测试工具的使用。