• Http协议、Tomcat、servlet


    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);
     
     

  • 相关阅读:
    艾伟_转载:C#来创建和读取XML文档 狼人:
    艾伟_转载:一个.NET委托的故事:彼得,老板和宇宙 狼人:
    艾伟_转载:.NET 4.0 Beta2中的BigInteger和Complex类 狼人:
    艾伟_转载:在C#中实现3层架构 狼人:
    艾伟_转载:从MySpace基于.NET平台的六次重构经历,来感受分布式 狼人:
    艾伟_转载:.NET设计模式:单件模式(Singleton Pattern) 狼人:
    艾伟_转载:.NET重写URL浅谈 狼人:
    Windows phone8 基础篇(二) XAML简介
    TCP/IP详解第十八章
    使用JCS时出现config.OptionConverter Could not instantiate class []的错误原因
  • 原文地址:https://www.cnblogs.com/baidawei/p/9001538.html
Copyright © 2020-2023  润新知