一、 web开发概述
所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行交互,流程如下:
● 什么是服务器?
Web服务器是指驻留于因特网上某种类型计算机的程序,它可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览; 它是一个容器,是一个连接用户与程序之间的中间件
WEB服务器有很多,流行的WEB服务器有Tomcat 、 WebSphere 、 WebLogic、Jboss等
在小型的应用系统或者有特殊需要的系统中,可以使用一个免费的Web服务器:Apache 的Tomcat,该服务器支持全部JSP以及Servlet规范
二、 web开发环境搭建
Tomcat官方站点:http://tomcat.apache.org
注:JDK8 对应的版本为 Tomcat 9
● 获取Tomcat安装程序包
tar.gz文件是Linux操作系统下的安装版本
zip文件是Windows系统下的压缩版本
● 安装JDK
设置JAVA_HOME环境变量
设置PATH环境变量
● 安装Tomcat
解压tomcat压缩文件
● Tomcat 的目录层次结构
● 运行
双击 bin 目录下的 startup.bat 文件
输入:
http://localhost:端口号 (一般是8080)
或http:127.0.0.1:端口号
或局域网ip:端口号
先打开startup.bat,再打开浏览器,在地址栏中输入http://localhost:8080或localhost:8080回车,如果看到Tomcat自带的一个JSP页面,说明JDK和Tomcat已搭建成功。
● 常见问题
乱码
问题描述:打开 startup.bat 后汉字乱码
解决方法:在 .\apache-tomcat-9.0.43\conf下打开logging.properties文件
将 java.util.logging.ConsoleHandler.encoding = UTF-8
替换为 java.util.logging.ConsoleHandler.encoding = GBK
与其他服务的端口号冲突
tomcat端口号默认8080,如果和其他服务的端口号冲突,则可对端口号进行修改在.\apache-tomcat-9.0.43\conf下打开server.xml文件,在文件的69行左右,将port="8080"修改为指定某一端口号,重新启动。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
三、 web开发环境搭建
创建并发web项目
1.创建javaWeb项目
2.发布web应用到服务器
自动将web应用发布到web服务器下,需要在开发工具中集成 tomcat进来
● 打开IDEA,创建新项目:
junit 的配置这部分可以直接删除
● 新建Web后端项目
● 在IDEA部署Tomcat
在IDEA中集成Tomcat后,修改代码后,可以直接部署到Tomcat 中
注意是Tomcat Server 中的 Local
选择bin的上级目录
OK
把这个取消掉
删掉后缀,避免后续麻烦(至于会有什么麻烦,我也不到哇,老师是这么教的)
OK,添加成功
● 运行,测试
点击运行,等待,在webapps中找到该项目,点击index.html,打开
四、 Servlet
Servlet是Server Applet的简称,意思为用Java编写的服务器端的程序,它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用Servlet方法。
● Servlet的作用
1、接收用户发送的请求数据
2、调用其他的java程序来处理请求
3、根据处理结果,将结果响应给客户端
● Servlet创建和使用
1、创建一个类继承javax.servlet.http包下的HttpServlet
2、在web.xml文件中配置Servlet
<?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>demo</servlet-name>
<servlet-class>com.ffyc.dormServer.web.DemoServlet</servlet-class><!-- 全类名 -->
</servlet>
<!-- 为servlet程序配置一个地址 -->
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
3、运行Servlet程序
通过浏览器访问http:localhost:8088/项目名/配置的url
例如我的项目名也是 dormServer 配饰的url是 /demo
控制台:
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在 web.xml 文件中使用<servlet>元素和<servlet-mapping>元素完成
问题:
解决: 前面的端口号是正确的,不然会是直接无法访问,那么错误的就会是 /项目名/配置的url 中的项目名错误或者URL错误
如果部署后修改了代码,然后发现怎么编译都不行,这个时候就要用maven 中的clean来清除部署,然后重新加载
五、 Servlet生命周期
● 创建
只被调用一次,只有第一次访问Servelt时创建Servlet实例,由服务器创建
● 初始化
构造方法执行完成后,调用init()执行一些初始化操作
● 服务
每次请求时调用service()方法
● 销毁
服务器关闭时,会销毁Servlet对象,并且在销毁servlet对象时,会自动调用destroy()方法,执行一些最总操作
六、 http协议
什么是HTTP?
超文本传输协议 (HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于定义客户端浏览器和服务器之间交换数据的过程。
HTTP是一个基于TCP/IP通信协议来传递数据.
HTTP是一个属于应用层的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统
七、 http请求
● http请求?
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个http请求。
请求包括:请求行,请求头,请求体
请求行包含:http请求方式,请求资源名称,http版本
请求头包含主机地址,以及客户端的一些环境信息,以键值对的形式传递:
Host: 127.0.0.1:8088 请求的主机地址
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
浏览器能够处理的内容类型
Accept-Encoding: gzip, deflate, br 浏览器能够处理的压缩编码
Accept-Language: zh-CN, zh; q = 0.9 浏览器当前设置的语言
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/69.0.3497.100 Safari/537.36 使用的浏览器和操作平台信息
Connection: keep-alive 浏览器与服务器之间连接的类型
请求体代表着浏览器在post请求方式中传递给服务器的参数,请求体中参数以键值形式传递,多个用&链接,服务器接收到后再解析
username=admin&userpwd=123
● http请求!
GET方式:
超链接访问,默认是GET方式
form提交,不指定method,默认为GET方式
POST方式:
form提交,指定method=“POST”
Get方式与post方式的区别:
Get方式主要是从服务器获取信息;post主要是想服务器提交信息
Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在请求体中提交。
get方式:
post方式:
GET方式提交的数据大小受限制一般1kb(不同浏览器也会有不同);而 POST则没有此限制。
● http请求~
请求和响应是Web交互最基本的模式,在Servlet中,用HttpServletRequest来表示请求。
HttpServletRequest :封装了请求的信息,可以从中获取任何请求信息。
getParameter( "name" ) --- String 通过name获得值
● 处理post请求中文乱码 request.setCharacterEncoding(编码格式)
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost");
//设置解码的编码格式
req.setCharacterEncoding("utf-8");
String account = req.getParameter("account");
String password = req.getParameter("password");
System.out.println(account);
System.out.println(password);
}
● http请求。
都是 HttpServletRequest req 中的方法
● getMethod()得到客户机请求方式
● getScheme()请求协议
● getRemoteAddr()返回发出请求的客户机的IP地址
● getServerName()服务器名(ip或域名)
● getServerPort()服务器端口
八、 http响应
● http响应?
一个http响应代表服务器向客户端回送的数据,它包括:响应行,响应头,响应体。
响应行里包含了http协议版本,以及用于描述服务器对请求的处理结果。
HTTP/1.1 (协议版本) 200(状态吗) OK(状态码描述)
状态码:服务器和浏览器用于确定状态的固定数字号码
200:请求成功
302:请求重定向
400:语义有误,当前请求无法被服务器理解或请求参数有误
404:请求资源不存在,通常是路径写错了或者服务器资源删除了
500:服务内部错误(代码异常)
响应头用于描述服务器的基本信息,以及数据描述
Server Apache-Coyote/1.1
Content-Type text/html;charset=UTF-8
Content-Length 0
Date Wed, 13 Sep 2017 02:26:07 GMT
响应体代表服务器向客户端浏览器回送的正文
● http响应
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个代表响应的HttpServletResponse 对象。
九、 过滤器
● 过滤器
Filter 也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过 Filter技术,对web服务器管理的所有web资源:例如Servlet, 从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
● 作用:对服务器web资源进行拦截(权限控制,通过拦截资源进行权限控制,是否可以访问)
● Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。
使用场景:
1、统一编码过滤
2、权限验证
3、跨域过滤
● 过滤器接口
Servlet API 中,与过滤器有关的API共有三个接口,分别是
● Filter
● FilterChain
● FilterConfig
● Filter
Filter接口是过滤器类必须实现的接口,该接口中有三个方法。
● init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次。参数 FilterConfig可以获得filter的初始化参数。
● doFilter(ServletRequest request, ServletResponse response, FilterChain chain):该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法。方法体中可以对 request 和 response 进行预处理。其中FilterChain可以将处理后的 request 和 response 对象传递到过滤链上的下一个资源。
● destroy():该方法在容器销毁过滤器对象前被调用。
法一:只通过重写 doFilter方法来实现编码过滤器(编译后不好修改,智能通过对原码进行修改后重编译)
定义类,实现Filter接口,在接口中重写doFilter方法
package com.ffyc.dormServer.filter;
import javax.servlet.*;
import java.io.IOException;
/*
定义统一编码过滤
*/
public class EncodFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("编码过滤器");
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=utf-8");
filterChain.doFilter(servletRequest,servletResponse);//让请求离开当前过滤器项目
}
}
然后再web,xml中将过滤器导入
法二:直接定义 requncod 和 respencod ,然后通过重写 init 方法来获取 web.xml文件中定义的参数,再在 doFilter方法中直接通过变量实现编码过滤器(程序编译后,仍可通过修改web.xml文件来修改编码过滤器的条件)
package com.ffyc.dormServer.filter;
import javax.servlet.*;
import java.io.IOException;
/*
定义统一编码过滤
*/
public class EncodFilter implements Filter {
String requncod = "";
String respencod = "";
//可以通过调用web.xml中的来修改
@Override
public void init(FilterConfig filterConfig) throws ServletException {
requncod = filterConfig.getInitParameter("reqencod");
respencod = filterConfig.getInitParameter("respencod");
System.out.println(requncod);
System.out.println(respencod);
}
// //编译后难以修改
// @Override
// public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// System.out.println("编码过滤器");
// servletRequest.setCharacterEncoding("utf-8");//设置请求数据编码格式
// servletResponse.setContentType("text/html;charset=utf-8");//设置相应内容编码格式
// filterChain.doFilter(servletRequest,servletResponse);//让请求离开当前过滤器项目
// }
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("编码过滤器");
servletRequest.setCharacterEncoding(requncod);//设置请求数据编码格式
servletResponse.setContentType(respencod);//设置相应内容编码格式
filterChain.doFilter(servletRequest,servletResponse);//让请求离开当前过滤器项目
}
}
相比上一个多了两个参数 reqencod ,respencod