web开发
服务器:服务器本身就是一段应用程序,作用:用于存放可执行的代码。根据用户的请求去匹配一段在报务器中保存的代码,并将之运行起来,最后将运行的结果反馈给用户。
服务器的类型:
apache nginx tomcat。。。。
tomcat安装:
安装包解压即可用。
解压时注意:解压一个无中文无空格的目录中。
配置环境变量。
web项目的架构形式:
CS:c:client(客户端) s:server(服务端)
优势:客户端和服务端都是同一家公司开发的,客户端与服务端的通信成本很低
缺点:客户端需要单独进行开发,客户端一般都比较大,下载时比较耗资源
BS:b:browse(浏览器), s:server(服务端)
实际上将浏览器当成了通用的客户端。
优势:无需开发专用的客户端,使用浏览器作为通用客户端。无需下载,节约资源。
缺点:浏览器与服务端的通信将变得非常困难。
协议:
HTTP协议,超文本传输协议 hyper text transfer protocal,是一个简单的请求-响应协议。
http请求格式:
1、请求行:请求提交方式 URL 。。。。。
2、请求头:以键值对的形式出现
3、空行
4、请求正文:请求的提交方式决定了是否存在请求正文。
GET:无请求正文,因为用户提交的数据会拼接在URL后
POST:有请求正文,因为URL中不拼接用户数据,需要通过请求正文将用户提交的数据发送到后台服务器中
http响应格式
响应状态码
常见错误响应状态码
400-499 客户端错误响应
- 400 Bad Request: 请求语法有问题,服务器无法识别:没有host请求头字段,或者设置了超过一个的host请求头字段。
- 401 UnAuthorized: 客户端未授权该请求。缺乏有效的身份认证凭证,一般可能是未登陆。登陆后一般都解决问题。
- 403 Forbidden: 服务器拒绝响应。权限不足。
- 404 Not Found: URL无效或者URL有效但是没有资源。
- 405 Method Not Allowed: 请求方式Method不允许。
- 406 Not Acceptable: 资源类型不符合服务器要求。
- 407 Proxy Authorization Required: 需要代理授权。
- 408 Request Timeout:服务器将不再使用的连接关闭。响应头会有Connection: close。
- 426 Upgrade Required: 告诉客户端需要升级通信协议。
500-599 服务器错误响应
- 500 Internal Server Error: 服务器内部错误,未捕获。
- 502 Bad Gateway: 服务器作为网关使用时,收到上游服务器返回的无效响应。
- 503 Service Unavailable: 无法服务。一般发生在因维护而停机或者服务过载。一般还会伴随着返回一个响应头Retry-After: 说明恢复服务的估计时间。
- 504 Gateway Timeout: 网关超时。服务器作为网关或者代理,不能及时从上游服务器获取响应返回给客户端。
- 505 Http Version Not Supported: 发出的请求http版本服务器不支持。如果请求通过http2发送,服务器不支持http2.0,就会返回该状态码。
URI和URL
URI:统一资源标识符,作用:用于标记一个互联网上的资源名称。
URL:统一资源定位符,作用:不但可以标记一个互联网上的资源名称,还可以标记该资源所在的位置。URL是URI的子集。
uri表现形式:协议:资源名称
fttp://a.png
url的表现形式:协议+主机名+端口+资源名称
http://192.168.40.132:8099/a.png
ip:用于定位一台互联网上的设备
端口:用于定位设备中的某个软件
web开发三大组件
三大组件:servlet、filter、 listener
servlet
作用:接收请求,作出响应。
servlet的三种创建方式
1、实现servlet接口
package com.woniuxy.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* 实现servlet接口创建servlet
*/
public class ImplementsServletInterfaceServlet implements Servlet {
/**
* servlet的初始化时执行的方法
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet init...");
}
/**
* 此方法用于获取servletConfig
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* servlet接收请求,作出响应的方法
* 生命周期中的重要方法,该方法每接收一次请求,都会被调用一次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet service...");
}
/**
* 用于编写一些对当前servlet的描述信息
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* servlet销毁时调用的方法
*/
@Override
public void destroy() {
System.out.println("servlet destroy...");
}
}
2、继承GenericServlet
package com.woniuxy.servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class ExtendsGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("ExtendsGenericServlet service...");
}
}
3、继承HttpServlet
package com.woniuxy.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ExtendsHttpServlet extends HttpServlet {
/**
* 只能处理get请求
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
// @Override
// protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// doPost(req,resp);
// }
/**
* 只能处理post请求
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
// @Override
// protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("ExtendsHttpServlet doPost ...");
// }
/**
* 重写service(),就可以处理所有请求提交方式
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("ExtendsHttpServlet service ...");
}
}
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>testServlet</servlet-name>
<servlet-class>com.woniuxy.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<!--
配置servlet:
<servlet>
<servlet-mapping>
-->
<servlet>
<servlet-name>implementsServletInterfaceServlet</servlet-name>
<!--指定接收的请求由哪个类来进行处理-->
<servlet-class>com.woniuxy.servlet.ImplementsServletInterfaceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>implementsServletInterfaceServlet</servlet-name>
<!--
http://localhost:8080/iss
url-pattern匹配的URL中除协议+ip+端口以外的部分
-->
<url-pattern>/iss</url-pattern>
//url-parttern可以重复多个
</servlet-mapping>
<servlet>
<servlet-name>extendsGenericServlet</servlet-name>
<servlet-class>com.woniuxy.servlet.ExtendsGenericServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>extendsGenericServlet</servlet-name>
<url-pattern>/egs</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>extendsHttpServlet</servlet-name>
<servlet-class>com.woniuxy.servlet.ExtendsHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>extendsHttpServlet</servlet-name>
<url-pattern>/ehs</url-pattern>
</servlet-mapping>
</web-app>
servlet生命周期
如果配置了<load-on-startup>,servet的生命周期就和tomcat容器保持一致。tomcat容器启动时,servlet就完成初始化,tomcat关闭时,servlet就完成销毁。
如果不配置<load-on-startup>,servlet的初始化工作会在接收第一次用户请求时完成。
<servlet>
<servlet-name>implementsServletInterfaceServlet</servlet-name>
<!--指定接收的请求由哪个类来进行处理-->
<servlet-class>com.woniuxy.servlet.ImplementsServletInterfaceServlet</servlet-class>
<!--
如果配置了<load-on-startup>,则servlet会在tomcat容器启动时,完成初始化工作
<load-on-startup>的值是一个非零整数,值越小,初始化的时机就越早
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>implementsServletInterfaceServlet</servlet-name>
<!--
http://localhost:8080/iss
url-pattern匹配的URL中除协议+ip+端口以外的部分
-->
<url-pattern>/iss</url-pattern>
</servlet-mapping>
注解配置servlet
要求:web application的版本必须高于3.0
//注解的参数放置是url-pattern的值,如果使用精确匹配,前面的/不能少。如果少了,tomcat启动会失败。
@WebServlet("/acs")//http://localhost:8080/acs
public class AnnotationConfigServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("AnnotationConfigServlet service...");
}
}
url-pattern
url-pattern的配置方式有多种,在配置时可以使用*号通配符来完成通配
注意:使用*号进行通配时,*号不能出现在中间,只能出现在最前或最后的位置
精确匹配 /自定义的url-pattern
后缀匹配 *.do
路径匹配 /*:匹配所有路径 /a/b/c/*:匹配某个精确路径之后的所有路径
/:匹配所有
注意:一般不会去配置/或/*,因为配置过后,web项目中的静态资源无法访问。
web.xml
<servlet>
<servlet-name>urlPatternServlet</servlet-name>
<servlet-class>com.woniuxy.servlet.UrlPatternServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>urlPatternServlet</servlet-name>
<!--
url-pattern的配置方式有多种,在配置时可以使用*号通配符来完成通配
注意:使用*号进行通配时,*号不能出现在中间,只能出现在最前或最后的位置
/ups 精确匹配
*.do 后缀匹配 http://localhost:8080/a.do http://localhost:8080/b.do
/a/b/c/* 路径匹配 http://localhost:8080/a/b/c/abcdefg /*:匹配所有
/ 匹配所有
-->
<!-- <url-pattern>/ups</url-pattern>-->
<url-pattern>/*</url-pattern>
</servlet-mapping>
servlet
public class UrlPatternServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// super.service(req, resp);
System.out.println("UrlPatternServlet service...");
}
}
servletConfig
作用:用于获取servlet配置的信息,无需读取xml文件。
web.xml
<servlet>
<servlet-name>urlPatternServlet</servlet-name>
<servlet-class>com.woniuxy.servlet.UrlPatternServlet</servlet-class>
<!--配置servlet的初始化参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>a</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>b</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>c</param-name>
<param-value>3</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>urlPatternServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
servlet
- this.getServletConfig()
- servletConfig.getServletName()
- servletConfig.getInitParameterNames()
- servletConfig.getInitParameter(“encoding”);
- servletConfig.getServletContext()
public class UrlPatternServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取servletConfig对象
ServletConfig servletConfig = this.getServletConfig();
//获取servlet-name标签的值
String servletName = servletConfig.getServletName();
System.out.println(servletName);
//根据初始化参数的name值去获取value值 :参数为<param-name>标签的值
String encoding = servletConfig.getInitParameter("encoding");
System.out.println(encoding);
//getInitParameterNames()用于获取当前servlet的所有初始化参数的name
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
//hasMoreElements():判断是否还有元素。
while (initParameterNames.hasMoreElements()) {
//nextElement():从枚举集合中去获取下一个元素。
String name = initParameterNames.nextElement();
String value = servletConfig.getInitParameter(name);
System.out.println("param-name:"+name+",param-value:"+value);
}
//获取web应用上下文对象
ServletContext servletContext = servletConfig.getServletContext();
System.out.println(servletContext);
System.out.println("UrlPatternServlet service...");
}
}
处理请求
HttpServletRequest:由tomcat服务器在接收到请求后,封装出来的对象,只管使用即可。
- //解决请求中文乱码问题
req.setCharacterEncoding(“UTF-8”); - req.getMethod()
- req.getRequestURL()
- req.getRequestURI()
- req.getScheme()
处理响应
HttpServletResponse:响应对象
- //解决响应中文乱码问题
resp.setContentType(“text/plain;charset=utf-8”);
resp.setCharacterEncoding(“UTF-8”); - resp.getWriter()
- writer.write()
- resp.setHeader(“a”,“1”)
- resp.addHeader(“b”,“2”)
- //设置响应状态
resp.setStatus(404); - 响应错误信息
resp.sendError(404);
package com.woniuxy.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet("/trs")
public class TestRequestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决请求中文乱码问题
req.setCharacterEncoding("UTF-8");
//解决响应中文乱码问题
resp.setContentType("text/plain;charset=utf-8");
resp.setCharacterEncoding("UTF-8");
//获取输出流
PrintWriter writer = resp.getWriter();
//调用API将内容写出到浏览器中
writer.write("今天的课程内容非常简单,非常轻松");
writer.print("<h1>今天的课程内容非常简单,非常轻松</h1>");
//设置响应头
resp.setHeader("a","1");
resp.setHeader("a","2");
resp.setHeader("a","3");
resp.setHeader("a","4");
//添加响应头
resp.addHeader("b","2");
resp.addHeader("b","3");
resp.addHeader("b","4");
resp.addHeader("b","5");
//设置响应状态
// resp.setStatus(404);
//响应错误
resp.sendError(404);
//处理请求
/*****************获取请求行的数据******************/
//获取请求的提交方式
System.out.println(req.getMethod());
//获取请求的URL
System.out.println(req.getRequestURL());
//获取请求的URI
System.out.println(req.getRequestURI());
//获取协议
System.out.println(req.getScheme());
/*****************获取请求头的数据******************/
//根据请求头中key获取其value值
System.out.println(req.getHeader("Accept"));
//获取所有头部字段的名称
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = req.getHeader(headerName);
System.out.println(headerName+":"+headerValue);
}
// Enumeration<String> headers = req.getHeaders();
/*****************获取用户传递的数据******************/
// http://localhost:8080/trs?username=tom&password=111
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+":"+password);
}
}
HeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = req.getHeader(headerName);
System.out.println(headerName+":"+headerValue);
}
// Enumeration headers = req.getHeaders();
/*****************获取用户传递的数据******************/
// http://localhost:8080/trs?username=tom&password=111
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+":"+password);
}
}