可以配置启动的端口号
<Connector port="8080"
redirectPort="8443"
connectionTimeout="20000" protocol="HTTP/1.1"/>
tomcat默认端口号为:8080
可以配置主机的名称
-<Host name="localhost"
autoDeploy="true"
unpackWARs="true" appBase="webapps">
默认的主机名为:localhost->127.0.0.1
默认网站应用存放的位置为:webapps
.发布一个web网站
将自己写的网站,放在服务器tomcat中指定的web应用的文件夹webapps下,就可以访问了。
HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在tcp之上。 默认端口号为:80
Cache-Control: private 缓存控制
Connection: keep-alive 连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
Accept:text/html 告诉游览器,它所支持的数据类型
Accept-Encoding: gzip, deflate, br 支持哪种编码格式:GBK,UTF-8,GB2312
Accept-Language: zh-CN,zh;q=0.9 告诉游览器,他的语言环境
Cache-Control: max-age=0 缓存控制
Connection: keep-alive 告诉游览器,请求完成是断开还是保持连接
1)请求行中的请求方式:get
2)请求方式:get/post/head/delete/put/tract
get:请求能够携带的参数比较少,大小有限制,会在游览器的URL抵制栏显示数据的内容,不安全,但高效
post:请求能够携带的参数没有限制,大小有限制,不会在游览器的URL抵制栏显示数据的内容,安全,但不高效
服务器----响应()----客户端
例如百度:
Cache-Control: private 缓存控制
Connection: keep-alive 连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
Accept:text/html 告诉游览器,它所支持的数据类型
Accept-Encoding: gzip, deflate, br 支持哪种编码格式:GBK,UTF-8,GB2312
Accept-Language: zh-CN,zh;q=0.9 告诉游览器,他的语言环境
Cache-Control: max-age=0 缓存控制
Connection: keep-alive 告诉游览器,请求完成是断开还是保持连接
HOST: 主机..../..
Refrush: 告诉客户端,多久刷新一次
Location: 让网页重新定位
200:请求响应成功
3**:请求重定向 - [1] 重定向:你重新到我给你新的位置去;
404:找不到资源
5xx:服务器代码错误 500 502:网关错误
maven的核心思想:约定大于配置
**·**有约束,不要去违反
在我们的系统环境变量中,配置如下配置:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
建立一个本地仓库:localRepository
<localRepository>E:\vue\apache-maven-3.6.3\maven-repo</localRepository>
把实现了Servlet接口中的java程序叫做:Servlet
Servlet接口sun公司有两个默认的实现类:HttpServlet,GenericServlet
1.构建一个普通的maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建立Moudel;
2.关于Maven父子工程的理解:
父项目中会有:
<modules>
<module>servlet-01</module>
</modules>
子项目汇总会有:
<parent>
<artifactId>java-servlet-01</artifactId>
<groupId>com.xs</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的java子项目可以直接使用:
son extend father
3.Maven环境优化:
1)修改web.xml为最新的
2)将maven的结构搭建完整
4.编写一个Servlet程序
1)编写一个普通类
2)实现 Servlet接口,这里我们直接继承HttpServlet
public class HelloServlet extends HttpServlet{
public HelloServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter();
writer.print("hello,servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
5.编写Servlet的映射
为什么需要映射:我们写的是java程序,但是需要通过游览器访问,而游览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给他一个游览器能够访问的路径。
<servlet> //注册servlet
<servlet-name>hello</servlet-name>
<servlet-class>com.xs.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping> //servlet的请求路径
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
6.配置Tomcat
7.启动测试
Servlet是由Web服务器调用,web服务器在收到游览器请求之后,会:
1.一个Servlet可以指定一个映射路径:
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.一个Servlet可以指定多个映射路径:
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
3.一个Servlet可以指定通用映射路径:
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*
4.指定一些后缀或者前缀等等…:
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
5.优先级问题:
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
<!--404-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.xs.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
1. 共享数据
在一个servlet中的数据,在另一个servlet中可以获得;
在HelloServlet中doGet中引用servletContext:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String name="行帅";
servletContext.setAttribute("name", name)
在GetServlet中调用在HelloServlet中写入的内容,从而实现两个Servlet的数据共享 :
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//调用getServletContext()函数从来获得别的Servlet中的数据
String name = (String) context.getAttribute("name");
//获得另个一个Servlet中的数据name
resp.setContentType("text/html"); //将中文方式输出
resp.setCharacterEncoding("UTF-8");
resp.getWriter().print("名字"+name);
}
2.获取初始化参数
ServletDemo中Doget中:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String url = servletContext.getInitParameter("url");
resp.getWriter().print(url);
xml文件中:
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
3.请求转发
在ServletDemo04中实现请求转发函数:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
servletContext.getRequestDispatcher("/gp").forward(req,resp);
//getRequestDispatcher("/gp")转发的请求路径,调用forward实现请求转发
}
web服务器接收到客服端的HTTP请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse对象。
1.简单分类
负责向游览器发送数据的方法:
1. ServletOutputStream getOutputStream() throws IOException;
//数据流
2. PrintWriter getWriter() throws IOException; //数据值
负责向游览器发送响应头的方法:
1. void setCharacterEncoding(String var1);
2. void setContentLength(int var1);
3. void setContentLengthLong(long var1);
4. void setContentType(String var1);
5. void setDateHeader(String var1, long var2);
6. void addDateHeader(String var1, long var2);
7. void setHeader(String var1, String var2);
8. void addHeader(String var1, String var2);
9. void setIntHeader(String var1, int var2);
7. void addIntHeader(String var1, int var2);
负责响应的状态码:
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2.常见应用
1.向游览器输出消息(例如getWrite())
2.下载文件
1)要获取下载文件的路径
2)下载的文件名是啥
3)设置想办法让游览器能够支持下载我们需要的东西
4)获取下载文件的输入流
5)创建缓冲区
6)获取OutputStream对象
7)将FileOuputStream流写入到buffer缓冲区
8)使用OutputStream将缓冲区中的数据输出到客户端
3.验证码功能
验证怎么来?
4.实现重定向
一个web资源收到客户端请求后,他会通过客户端去访问另一个web资源,这个过程叫做重定向。
方法:
void sendRedirect(String var1) throws IOException;
sendRedirect()
函数的作用是重定向网页,向浏览器发送一个特殊的Header,然后由浏览器来做重定向,转到指定的页面。
测试:
//RedirectServlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("/s3/getc");
//xml
<servlet>
<servlet-name>RedirectServlet</servlet-name>
<servlet-class>com.xs.servlet.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RedirectServlet</servlet-name>
<url-pattern>/red</url-pattern>
</servlet-mapping>
resp.sendRedirect("/s3/getc");
作用:重定向
重定向与转发的区别:
相同点: 页面都会发生跳转
不同点: 请求转发的时候,url不会产生变化;重定向的时候,url地址栏会发生变化。
HttpServletRequset代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到Request,通过这个HttpServletRequset的方法,可以获得客户端的所有信息。
1.获取前端传递的参数,并且转发
Servlet:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
req.getRequestDispatcher("/success.jsp").forward(req,resp);
//进行请求转发
}
1.String getParameter(String name):
根据参数名称获取参数值()
2.request.getRequestDispatcher()
有两种跳转:(请求转发)
(1)跳转到一个servlet
` request.getRequestDispatcher("想跳转的servlet名").forward(request, response);`
(2)跳转到一个页面
`request.getRequestDispatcher("文件路径").forward(request, response);`