Tomcat服务器常用配置和HTTP简介
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
Web服务器常用配置
1.Web系统采用B/S结构通信的:Browser --- Server
1)浏览器向服务器发送访问目标资源请求(请求)
2)服务器根据请求的目标资源路径,在服务器端进行查找(请求查找)
3)服务器会将查找结果返回给客户端浏览器(响应)
通信结构图:
2.什么是Web服务器?
包括硬件环境和软件环境,在网络中安装web服务器软件的计算机
3.Tomcat服务器安装和配置
1)在Apache官网上下载tomcat服务器
*一般采用zip格式的(可直接解压使用)
2)解压缩tomcat
*不要使用含有空格和中文目录的文件夹
3)启动tomcat之前,配置JAVA_HOME环境变量 ---- 配置JDK安装路径
*注意JAVA_HOME使用下划线
4)启动tomcat服务器
双击bin/startup.bat(如果使用linux双击bin/startup.sh)
输入http://localhost:8080/ 访问tomcat网站主页
5)因为网站通过HTTP协议访问,HTTP协议默认端口80 ---- 修改tomcat服务器启动端口80
修改conf/server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> 将8080修改为80
访问localhost:80端口 ----- 省略端口写法 http://localhost访问站点
4.tomcat启动问题
1)窗口一闪然后消失 ----- 编辑startup.bat,在文件末尾加入pause指令,再次运行,读取错误原因,根据原因解决
*JAVA_HOME路径必须是JDK不可以是JRE
2)端口占用问题
发现端口被占用后,通过cmd命令行,查看占用端口进程 ---- netstat –ano
在任务管理器关闭该进程
3)CATALINA_HOME环境变量
指定tomcat安装位置(该环境变量可以不配置) ---- 如果配置出错,tomcat将无法启动
5.各种版本对应问题
Tomcat版本 Servlet/JSP版本 JavaEE版本 运行环境
4.1 2.3/1.2 1.3 JDK1.3
5.5 2.4/2.0 1.4 JDK1.4
6.0 2.5/2.1 5.0 JDK5.0
7.0 3.0/2.2 6.0 JDK6.0
Tomcat 支持Servlet和JSP规范,Servlet技术属于JavaEE规范
* 随着javaEE 版本提升 -- Servlet版本提升 --- 运行Servlet环境Tomcat版本提升
* tomcat运行需要JDK 环境版本
如果编写 JavaEE5.0工程 需要哪个版本tomcat可以运行? 6.0 7.0
6.Tomcat目录结构
bin --- 存放tomcat启动关闭程序
conf --- 存放tomcat配置文件
lib --- tomcat运行需要jar包
logs --- tomcat日志文件
webapps --- 网站发布目录(所有网站可以发布到该目录)
work --- 存放工程运行时,产生数据文件(JSP翻译Servlet、Session持久化数据)
7.网站的标准目录结构
站点根目录
------- 静态web资源、jsp
------- WEB-INF目录
------- classes目录 (保存,class文件)
-------- lib 目录 (当前网站需要jar包)
-------- web.xml (网站配置文件)
* WEB-INF目录不是必须的,没有java动态程序代码, 可以没有WEB-INF 目录
* WEB-INF目录下资源不能被浏览器直接访问
8.网站开发好后,如果想让网站被外界访问,需要将网站发布到 web服务器tomcat上 (虚拟目录映射)
Tomcat发布网站三种方式
原理:
配置<Context>元素
1)配置tomcat/conf/server.xml
在<Host name=”localhost”>内部添加<Context>元素
<Context path="/aa" docBase="C:\AA" /> ---- 为网站配置虚拟目录 /aa ------映射到 c:\AA目录
*修改server.xml 重启tomcat
2)$CATALINA_HOME/conf/[enginename]/[hostname]/xxx.xml
tomcat/conf/Catalina/localhost/xxx.xml
在conf下新建Catalina
在Catalina下新建 localhost
在localhost下 新建 bb.xml
<Context docBase="C:\BB" /> --- 为什么不需要写path --- 虚拟目录就是文件名bb ,path默认/bb
*添加bb.xml,不用重启tomcat
*推荐第二种写法(不需要重启服务器,而且出错不会影响其它工程运行),尽量不要使用第一种
3)将网站复制到tomcat/webapps
*不用重启tomcat
*tomcat会根据文件夹名称,自动生成虚拟路径
9.虚拟目录?
当浏览器访问网站采用访问路径 /aa /bb /abc ----- 这些路径不一定是服务器真实存在目录,只是浏览器在访问这些路径时,映射到指定网站跟目录
10.WAR包制作?
先用压缩软件将网站制作xx.zip --- 重命名 xx.wat ---- 复制war到tomcat/webapps
11. Tomcat Manager 使用 (程序员管理已经发布到tomcat网站)
*conf/tomcat-users.xml 加入
<role rolename="manager"/>
<user username="tomcat" password="s3cret" roles="manager"/>
* 重启服务器
* 这个功能默认不要开启 (安全问题)
12.域名解析完整过程图:
在tomcat内部同时 架设多个网站 --- 百度网站、谷歌网站
* 虚拟主机技术 ---- 在tomcat中配置 <Host> 元素
1)搭建tomcat中网站 --- baidu
2)在c盘 新建虚拟主机目录 baidu , 在虚拟主机目录中新建网站根目录 main , 将百度网站复制main 目录中
3)在tomcat中新建
<Host>
Host name="www.baidu.com" appBase="C:\baidu"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
* 重启tomcat
4)修改本机hosts文件
* win7 系统 ,将hosts文件复制到桌面修改,改后复制回去
192.168.1.145 www.baidu.com
5)将c:\baidu\main 网站根目录 配置为缺省虚拟目录
<Context path="" docBase="main" />
----- 配置缺省虚拟目录 /main 省略
http://www.baidu.com/baidu.htm ---- 访问本机百度
6)将main目录 baidu.htm 配置 网站欢迎页面
新建WEB-INF目录 下新建web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<welcome-file-list>
<welcome-file>baidu.htm</welcome-file>
</welcome-file-list>
</web-app>
hosts应用
1、限制用户上网 ,网站禁止访问
2、软件破解
13.缺省虚似主机 DefaultHost
<Engine name="Catalina" defaultHost="localhost"> ----- 一个tomcat中可以配置多台虚拟主机,但是只有一台虚拟主机。客户端可以直接通过ip访问
http://www.baidu.com ---- 客户端通过域名访问
http://192.168.1.145 ---- 通过ip访问
只有缺省虚拟主机可以通过ip访问
14. MyEclipse 整合 tomcat 进行 web 程序开发
1)配置myeclipse 内部tomcat 插件
配置tomcat6 在 window - preferences -- tomcat6
检查JDK 版本是否符合
Launch 默认采用 debug model
2)将tomcat插件设置为enable 浏览tomcat目录后 配置ok
3)在MyEclipse中通过插件 tomcat6 --- start 实际上 运行tomcat/bin/startup.bat
4)在console窗口 查看tomcat日志
* tomcat6 --- stop server 正常关闭tomcat 调用 tomcat/bin/shutdown.bat
* 如果直接点击 myeclipse console 窗口 红色按钮 --- 强行停止tomcat
应用:
在myeclipse中编写一个web工程
1)创建web project
context root url 默认工程名
Javaee 规范版本
* 在使用javaee5 规范版本时,默认支持jstl技术
2)新建html 将html编辑器 设置 html editor
window -- preference ---- general ---- editor --- File Associations
3)发布工程到tomcat
原理:将当前web工程复制tomcat/webapps
* 修改 发布虚拟目录名称 --- 右键工程属性 --- myeclipse ---web ----修改Web Context-root
HTTP协议
1.HTTP协议特征
1)基于TCP传输协议
OSI七层网络体系结构
TCP是传输层协议
HTTP是应用层协议,基于TCP协议
TCP特征:三层握手
例如
A给B说话:能听到我说话吗?
B回应:我能听到,能听到我说话吗?
A回应:我也能听到
确保通信畅通 ---- 数据传输不允许丢包
A给B发数据,如果B没有回应,A选择重新发送 ----- 超时
2)默认端口80
3)基于请求 – 响应模式的协议
先请求,在出现响应 ----- 请求和响应一一对应
2.两个实验
实验一 : 通过telnet 连接服务器,进行协议操作
XP 自动安装telnet
win7 系统 安装telnet插件
* telnet 采用 传输层连接原理方式 通信内容必须严格按照应用层协议
语法:telnet ip port
1、 cmd> telnet localhost 80
2、手动输入HTTP协议请求
telnet乱码解决:ctrl+] 回车
3、输入协议内容
GET / HTTP/1.0
HOST: localhost
回车
实验二 : 安装Httpwatch
完成访问web页面时 http协议数据包 抓取
3.查看网络连接过程中 http协议内容
请求内容
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: localhost
Connection: Keep-Alive
响应内容
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
ETag: W/"7347-1184876416000"
Last-Modified: Thu, 19 Jul 2007 20:20:16 GMT
Content-Type: text/html
Content-Length: 7347
Date: Sat, 09 Jun 2012 07:02:35 GMT
<?xml version="1.0" encoding="ISO-8859-1"?>
...
4.HTTP和HTML关系?
HTTP通信协议,规定数据传输格式
HTML网页设计语言,静态网页数据
HTTP 传输格式、 HTML传输内容
5.HTTP/1.0、HTTP/1.1区别?
在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源
HTTP1.1协议,运行客户端与web服务器建立连接后,在一个连接上获取多个web资源
6.一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求?
*三幅图片地址是否相同
如果三幅图片地址都不相同 --- 4次请求
HTTP请求
请求完整格式包括三个部分:请求行、头信息、请求体
1.请求行:请求中第一行信息 --- 包括三个部分 请求方式、资源路径、HTTP协议版本
例如:GET / HTTP/1.1
HTTP请求方式有七种:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
常用两种:GET、POST
1)客户端网页哪些是GET方式请求?哪些是POST请求
GET方式:1、用户直接在浏览器上手动输入url地址 2、<a href="url"></a>
3、<form method="get"> *form表单默认提交方式就是get
POST方式:1、<form method="post">
2)GET提交方式和POST提交方式区别?
GET提交方式后携带数据有大小限制1K,提交数据在url上显示
*http://localhost/day04/url?username=zhangsan 格式 url?name=value&name=value&name=value...
以?分隔url和参数,参数采用键值对格式,多个参数使用&符号分隔
POST数据在请求体重,不再url上显示,没有数据大小限制
*uesrname=zhangsang 请求体和信息头直接存在一个空行
2.头信息
Accept: text/html,image/* ----- 客户端可以接收文件类型 text/html->HTML文件 image/* 任意格式图片
Accept-Charset: ISO-8859-1 ----- 客户端可以识别编码字符集
Accept-Encoding: gzip ----- 客户端可以识别压缩数据格式,gzip是一种压缩格式
Accept-Language:zh-cn ----- 客户端浏览器语言
Host: www.itcast.com:80 ----- 访问服务器地址
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT ----- 该请求的资源在客户端保存最后访问时间(缓存有关)
Referer: http://www.itcast.com/index.jsp ---- 上一次请求访问页面
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) ---- 客户端浏览器类型版本
Connection: close/Keep-Alive ---- 该请求连接后,连接是保持还是关闭 1.0关闭 1.1保持
Date: Tue, 11 Jul 2000 18:23:51 GMT ---- 请求时间
3.请求体:存放客户端提交post请求数据
key=value&key=value&key=value ....
例如:username=sss
4.Referer防止客户盗链数据
eg:模拟浏览器访问服务器获得refererServlet当中信息
1)URL连接 --- HTTP协议
2)Socket连接 --- TCP协议
eg:
package cn.lsl.servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class RefererServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String referer = request.getHeader("referer"); //获得头信息
response.setContentType("text/html;charset=gbk");
if(referer == null || !referer.startsWith("http://localhost")){
//盗链
response.getWriter().println("盗链!");
return;
}else{
response.getWriter().println("XX网站欢迎您。。。。");
}
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }
直接输入网址,则会被当做盗链
从该网站的某个页面点进去则能正常访问
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head> <body>
<a href="referer">link</a>
</body>
</html>
模拟客户端,绕过防盗链逻辑,获得需要信息
package cn.lsl.servlet;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection; public class URLTest {
public static void main(String[] args) throws Exception {
//创建URL对象
URL url = new URL("http://localhost:8080/HTTPTest/referer");
//链接目标资源
URLConnection connection= url.openConnection();
connection.addRequestProperty("referer", "http://localhost/index.jsp");
//获得网站输入流
InputStream in = connection.getInputStream();
byte[] buf = new byte[1024];
in.read(buf); //将流数据读取buf中
for(byte b : buf){
System.out.write(b);
}
System.out.flush();
}
}
HTTP响应
响应数据 分为三个部分:状态行、头信息、响应体
1.状态行分为三个部分:HTTP协议版本、状态码、描述信息
例如:HTTP/1.1 200 OK
100~199 Informational 请求信息不足,还需要其他信息才能处理
200~299 Success 请求处理成功
300~399 Redirection 服务器已经处理完毕,客户端还需要进一步动作
400~499 Client Error 客户端错误
500~599 Server Error 服务器端错误
200 请求处理成功 302 客户端进行重定向 304 客户端访问资源没有被修改后,客户端访问本地缓存
404 访问资源不存在 500 服务器内部出错
2.响应头
Location: http://www.it315.org/index.jsp ---- 重定向地址 结合302一起使用
*重定向两次请求,两次响应
Server:apache tomcat ----- 服务器类型
Content-Encoding: gzip ---- 设置响应数据压缩格式
*如果响应数据经过压缩,传输体积更小,性能更好
例如:
在没有压缩情况下,13605字节 http://localhost/docs/
如何设置tomcat压缩
*通过设置tomcat/conf/server.xml设置响应数据压缩
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" compressableMimeType="text/html,text/xml,text/plain" compression="on"/>
清楚浏览器缓存,重启tomcat
4244字节 http://localhost/docs
Content-Length: 80 ----- 响应数据长度
Content-Language: zh-cn ----- 响应数据语言
Content-Type: text/html; charset=GB2312 ----- 响应数据类型
*数据类型采用Mime协议规定类型 html文件 ---- text/html、jpg文件 ---- image/jpeg
*在tomcat/conf/web.xml中查看文件mime类型
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT ----- 和请求头信息If-Modified-Since一起使用,控制服务器缓存
* ETag: W/"13397-1184876416000" tomcat生成Etag 13397文件大小 1184876416000文件最后修改时间(精确毫秒)
* 客户端下次请求时通过If-None-Match 携带刚刚 Etag信息
Refresh: 1;url=http://www.it315.org ----- 网页自动跳转
Content-Disposition: attachment; filename=aaa.zip ----- 文件下载时指定文件附件名称
控制该程序在客户端不缓存(以下三个一起使用)
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
*对于动态程序,经常修改,禁止浏览器缓存内容
Connection: close/Keep-Alive ---- 响应后连接是否关闭
Date: Tue, 11 Jul 2000 18:23:51 GMT --- 响应时间
3.响应体
通常为HTML文件内容 --- 如果设置响应体进行gzip压缩,看到gzip压缩内容
重定向:
eg:
package cn.lsl.servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class RedirectServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setStatus(302);
response.setHeader("Location", "index.jsp"); //重定向index.jsp
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
} }
设置浏览器不缓存
eg:
package cn.lsl.servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class NoCacheServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//需要三句禁止缓存,防止浏览器兼容问题
response.setDateHeader("expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.getWriter().println("aabbcc");
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
} }
通过HTTP协议Range头信息,实现断点下载功能
在连接服务器目标资源进行下载过程中,传递Range头信息,指定下载目标资源部分内容 --- 实现断点下载功能
断点下载:使用URL类模拟客户端访问WebRoot/info.txt,下载文件中内容
package cn.lsl.servlet;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection; public class RangeTest {
//通过Range头信息实现断点下载
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/HTTPTest/info.txt");
URLConnection connection = url.openConnection();
//通过addRequestProperty添加头信息,Range实现断点下载
connection.addRequestProperty("Range", "bytes=100-");
InputStream in = connection.getInputStream();
OutputStream out = new FileOutputStream("download.txt");
byte[] buf = new byte[1024];
int len;
while((len = in.read(buf)) != -1){
out.write(buf, 0, len);
}
in.close();
out.close();
}
}
Tomcat服务器常用配置和HTTP简介的更多相关文章
- JavaEE:Tomcat服务器常用配置和HTTP简介
Web服务器常用配置1.Web系统采用B/S结构通信的:Browser --- Server1)浏览器向服务器发送访问目标资源请求(请求)2)服务器根据请求的目标资源路径,在服务器端进行查找(请求查找 ...
- Tomcat服务器的配置
本地安装的Tomcat服务器版本是 Apache Tomcat/7.0.42 启动 localhost 使用Tomcat的前提是安装了jdk,我在本地安装了jdk7.Tomcat服务器的文件目录为F: ...
- 整合Solr到Tomcat服务器,并配置IK分词
好久没有接触新东西了,最新开始熟悉solr,实例展示单机环境solr整合. 整合方案一 1.下载Tomcat与solr并解压 Tomcat解压后磁盘路径为D:\program files\Tomcat ...
- jaee开发起步:tomcat服务器的配置
1.将下载下来的apache-tomcat-6.0.13.zip解压到任意文件夹. (打开tomcat官网,选择下载tomcat6.x.zip版本的tomcat不需要安装,直接解压并配置一下环境变量就 ...
- Tomcat服务器中配置多个域名,访问不同的web项目
先说一下在本地电脑怎么实现: 想要在一个tomcat下访问两个web项目时,可以通过添加虚拟host的方式来解决. 详细步骤如下: 1.将两个项目打包放入tomcat的webapps目录下: 2.修改 ...
- tomcat的常用配置
1.解決get请求的中文乱码问题 解决办法: 首先找到tomcat路径下的apache-tomcat-7.0.52\conf文件夹,打开server.xml文件,编辑如下内容: <Connect ...
- tomcat的常用配置方法
1.tomcat配置某个站点的欢迎页面的方法 2.tomcat配置虚拟目录的方法 3.tomcat配置虚拟主机的方法
- 启动tomcat服务器,配置CATALINA_HOME和JAVA_HOME
遇到很多次运行startup.bat后,一个窗口一闪而过的问题,但是从来没去纠正怎样修改配置才是正确的,现在从网上查阅的资料整理如下:tomcat在启动时,会读取环境变量的信息,需要一个CATALIN ...
- Nginx-Http服务器常用配置
#运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; ...
随机推荐
- 关于PHP的十大误解 你中了几个?
作为开发人员,你常常会在网上看到不使用XX的理由之类的新闻.而作为最受欢迎的开源服务器端脚本语言,PHP也难逃这样的命运.殊不知,金无足赤.人无完人,再流行的语言都会存在缺点,或者是误解,因此,有些开 ...
- 函数(Functions)
概念: 下面是蛮经典的解释: What Good are Functions? You might have considered the situation where you would li ...
- caffe简易上手指南(三)—— 使用模型进行fine tune
之前的教程我们说了如何使用caffe训练自己的模型,下面我们来说一下如何fine tune. 所谓fine tune就是用别人训练好的模型,加上我们自己的数据,来训练新的模型.fine tune相当于 ...
- NFC(13)使用Android Beam技术传输文件
注意 Android Beam技术传输文件时nfc只负责连接两个手机,而传输文件实际是用蓝牙模块.且目前接收文件功能只是系统完成,不用自写个接收程序. 传输文件相关的重要api 从Android4.1 ...
- Redis文档
http://manual.csser.com/redis/connection/auth.html
- PHP内置的Web Server的使用
自PHP5.4之后 PHP内置了一个Web 服务器. 让我们来看看php Web Server的简单使用: 启动php Web Server php -S localhost:8080 通过 php ...
- android MIPI屏 导航栏丢失
/**************************************************************************** * android MIPI屏 导航栏丢失 ...
- Hibernate4.x之入门篇
Hibernate作为一个优秀的持久化框架.ORM框架.在日常的Java开发中常常用到.本文主要通过一个简单的例子来介绍下Hibernate4.x的入门知识. 新建一个Java项目,并加入Hibern ...
- iOS开发之UILabel
UILabel是iOS开发中常用的一个组件,主要用来显示内容. UILabel的主要使用如下: /*尺寸*/ CGRect labelRect = CGRectMake(100, 100, 80, 4 ...
- CF GYM 100703I Endeavor for perfection
题意:有n个学习领域,每个领域有m个课程,学习第i个领域的第j个课程可以获得sij个技能点,在每个领域中选择一个课程,要求获得的n个技能点的最大值减最小值最小,输出符合要求的策略. 解法:尺取法.将课 ...