HTTP协议
Http,超文本传输协议是互联网上最广泛的一种网络协议,所有的www文件都必须遵守这个标准。
Http协议由http请求和http响应组成
http请求:
1.请求行
请求方式 POST、GET、PUT、DELETE等
请求的资源 /DemoEE/form.html
协议版本 http/1.1
2.请求头
cookie 浏览器缓存的cookie信息
User-Agent 客户端浏览器与操作系统相关信息
Connection 保持连接状态Keep-Alive 连接中,close 已关闭。
Host 请求的服务器主机名
Content-Length 请求的长度
Content-Type 如果是Post请求会由这个表头,默认值为 application/x-www-form-urlencodeed 表示请求提内容使用url编码
Accept 浏览器可MIME类型,文件类型的一种描述方式。如:text/html,text/css,text/javascript,iamge/*
Accept-Encoding 浏览器支持的数据压缩格式如GZIP压缩
Accept-Language 浏览器支持的语言
3.请求体
Post请求方式: 请求体会由请求的参数 如 username=1&password=2
Get请求方式:请求参数不会出现在请求体重,会拼接在url后面 xxx.jsp?username=1&password=2
Http响应:
1.响应行
Http 状态码 200(请求成功),302(请求重定向),304(请求资源没有改变,访问本地缓存),404(请求资源不存在),500(服务器内部错误)
2.响应头
Location 302时,指定响应的路径。
Content-Type 响应正文的类型MiMe类型
Set-Cookie 服务器向浏览器写入cookie
Content-Encoding 服务器使用的压缩格式
Content-length 响应正文长度
Refresh 定时刷新。 几秒后调到哪个url
Server 服务器名称
Last-Modified 文件最后修改时间
3.响应体
服务器返回给浏览器的页面正文,浏览器将正文加载到内存,然后渲染解析显示出来。
B/S Browser/Server 浏览器端
C/S Client/Server 客户端
静态资源:html页面,数据不会改变。
动态资源:写程序的页面,如asp、php。
Tomcat
Tomcat Apache 开源免费的中小型web应用服务器
点击tar.gz下载 windows下载 64-bit windows zip
Tomcat的目录结构
bin 脚本目录
conf 配置目录
lib 依赖jar库目录
logs 日志目录
temp 临时文件目录
webapps web应用发布目录
work tomcat处理jsp的工作目录
bin脚本目录
windows执行 .bat版本 mac执行.sh版本
启动脚本:startup.sh
停止脚本:shuntdown.sh
conf配置文件目录
核心配置文件:server.xml
用户权限配置文件:tomcat-users.xml
所有web项目默认配置文件:web.xml
打开终端
1.cd 进入根目录
2.执行 sh bin/startup.sh 启动服务器
3.浏览器输入localhost:8080
在webapps中放入网站 输入网址/文件夹名 即可访问
localhost:8080/myProject
如果启动失败常见原因:
1.端口冲突
server.xml
找到Connector元素 修改port属性可以更改端口号
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2.没有配置java_home环境变量
servlet
Servlet是运行在服务器端的java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应操作。
Servlet的生命周期
1. init(ServletCOnfig config) 初始化 创建servlet的时候执行
2.service(ServletRequest request,ServletResponse response) 每次请求都会执行
3.destroy() 销毁 servlet销毁时执行
一、Idea 配置
1.新建web application项目 Idea 选择 Java Enterprise -> web application
2.新版本没有web-inf文件夹 解决方法 进入project structure ->facets->点击小加号,添加web.xml
3.在web/WEB-INF目录下新建两个文件夹,classes用于存放servlet的字节码文件(.class),lib用于存放项目引用的包。
4.进入Project Structure,进入Modules(IDEA的工程)选项卡,将Paths的两个输出路径均改成第2步新建的classes。
5.然后点击Dependencies,选择右边+号,新建JARS路径,选择第2步创建的lib文件夹 - >Jar Directory
6.进入Artifacts选项卡,将输出目录定为Tomcat安装位置的webapps下新建的该工程文件夹
7.Run->Edit Configurations配置Tomcat,设置tomcat端口等信息。
8.设置默认启动路径http://localhost:9999/servlet/ 或手动输入
二、创建类并实现 Servlet接口 重写方法
public class QuickStartServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.print("init running..");
}
@Override
public ServletConfig getServletConfig() {
System.out.print("getServletConfig running..");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.print("service running..");
}
@Override
public String getServletInfo() {
System.out.print("getServletInfo running..");
return null;
}
@Override
public void destroy() {
System.out.print("destroy running..");
}
}
3.配置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_3_1.xsd"
version="3.1">
<!-- 对应的类-->
<servlet>
<servlet-name>QuickStartServlet</servlet-name>
<servlet-class>com.david.servlet.QuickStartServlet</servlet-class>
</servlet>
<!-- 访问路径-->
<servlet-mapping>
<servlet-name>QuickStartServlet</servlet-name>
<url-pattern>/QuickStartServlet</url-pattern>
</servlet-mapping>
</web-app>
浏览器输入http://localhost:9999/servlet/QuickStartServlet 访问
ServletContext 上下文对象
<servlet>
<servlet-name>QuickStartServlet</servlet-name>
<servlet-class>com.david.servlet.QuickStartServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>david</param-value>
</init-param>
</servlet>
新增init-param节点 使用Context上下文对象获取节点信息
public void init(ServletConfig config) throws ServletException {
String servletName = config.getServletName();
System.out.println(servletName);
String initParameter = config.getInitParameter("name");
System.out.println(initParameter);
}
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
默认首页列表
httpServlet
httpServlet实现了servlet接口,并实现servlet方法。
在httpServlet继承的父级类中实现的service方法 判断是get请求还是post请求然后执行doGet 或 doPost方法
public class QUickStartServletExtends extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
response.getWriter().write("doget..." + username + "pass:" + password);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.getWriter().write("dopost...");
}
}
HttpServletResponse
response.setStatus(302); //设置状态码
//添加响应头
response.addHeader("name","zhangsan");
response.addIntHeader("age",18);
response.addDateHeader("date",System.currentTimeMillis());
//修改已有的响应头
response.setHeader("name","lisi");
response.setIntHeader("",0);
response.setDateHeader("",0L);
重定向:
response.setStatus(302);
response.setHeader("Location","/servlet/QuickStartServlet");
方法:response.sendRedirect("/servlet/QuickStartServlet");
设置响应体
//设置编码
response.setCharacterEncoding("gb2312");
PrintWriter writer = response.getWriter();
writer.write("<h1>试试printwriter</h1>");
字节输出流
ServletOutputStream st = response.getOutputStream();
HttpServletRequest
在创建Servlet时,会重写service方法或doGet、doPost方法,这些方法都有两个参数一个是request请求一个是response响应
service方法中的request的类型是ServletRequest,而doGet、doPost方法的request类型是HttpServletRequest ,HttpServletRequest是ServletRequest的子接口。
1.通过request获得请求行
String method = request.getMethod();
String uri = request.getRequestURI();
StringBuffer url = request.getRequestURL();
String contextPath = request.getContextPath();
//get请求的参数
String param = request.getQueryString();
PrintWriter writer = response.getWriter();
writer.println("method:" + method);
writer.println("uri:" + uri);
writer.println("url:" + url);
writer.println("contextPath:" + contextPath);
writer.println("param:" + param);
method:GET uri:/servlet/QUickStartServletExtends url:http://localhost:9999/servlet/QUickStartServletExtends contextPath:/servlet param:name=david&pass=123
2.通过request获得请求头
String header = request.getHeader("User-Agent");
System.out.println(header);
Enumeration<String> headerNames= request.getHeaderNames();
while(headerNames.hasMoreElements()){
String headerName = headerNames.nextElement();
writer.println(headerName);
String headerValue = request.getHeader(headerName);
writer.println(headerValue);
}
3.通过request获得请求体
//获得指定参数
String name = request.getParameter("name");
String pass = request.getParameter("pass");
writer.println(name);
writer.println(pass);
//获得多个值
String[] parms = request.getParameterValues("checkbox");
for(String s : parms){
writer.println(s);
}
//获得所有请求参数名称
Enumeration<String> paramsNames = request.getParameterNames();
while(paramsNames.hasMoreElements()){
writer.println(paramsNames.nextElement());
}
//获得所有参数键值对集合
Map<String,String[]> maps = request.getParameterMap();
for(Map.Entry<String,String[]> entry : maps.entrySet()){
writer.println(entry.getKey());
for(String s : entry.getValue()){
writer.println(s);
}
writer.println("-------");
}
地址转发 与302重定向区别是 地址不发生改变
RequestDispatcher dis = request.getRequestDispatcher("/path");
dis.forward(request,response);