JavaWeb tomcat&Servlet

tomcat:

servlet

定义在web容器上的程序

细节

  1. servlet的init的方法只创建一次,则是单例的.
  2. ​ 当设置-2为-1时,第一次启动就创建init()方法,
  3. service()方法可以执行多次
  4. destroy():被销毁,只执行一次;一般于执行销毁之前执行;

servlet3.0

  1. ​ 支持注解配置,不需要web.xml了;

  2. 当然 自己用web.xml 去定义路径啥的,

    1. ​ marpping啥的

       <servlet>
           <servlet-name>demo1</servlet-name>
           <servlet-class>it.cast.web.servlet.servletDemo01</servlet-class>
       </servlet>
      <servlet-mapping>
          <servlet-name>demo1</servlet-name>
          <url-pattern>/demo1</url-pattern>
      </servlet-mapping>
      
  3. 步骤:创建java.EE项目,可以不创建web.xml

  4. 复写方法

  5. 定义一个注解,定义位置路径

    1.  /*
       * Servlet路径设置
       *  String[] urlPatterns(),
       * */
      
    2.  @WebServlet(urlPatterns = "/demo4")
      

在使用tomcat上使用http 的一些实战区别关于post.get

请求行
请求方式:请求URL 请求协议/版本

get:

  • ​ 请求参数在请求行中,在url后
  • 请求的url长度有限制
  • 不太安全(相对)

psot

  • 请求参数在请求体中
  • 请求url有长度限制
  • 相对安全

请求数据格式:

  • 请求行

    GEThttp://localhost:63342/itcast/day_15Servlet/servlet/demo03.html?usename=hhhhh#

  • 请求行
    请求方式:请求URL 请求协议/版本

  • get:

    • ​ 请求参数在请求行中,在url后
      • 请求的url长度有限制
      • 不太安全(相对)
  • psot

    • 请求参数在请求体中
      • 请求url有长度限制
      • 相对安全
  • 请求头

  •   Accept
      	text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
      Accept-Encoding
      	gzip, deflate
      Accept-Language
      	zh-CN,zh;q=0.8,en-US;q=0.7,zh-TW;q=0.5,zh-HK;q=0.3,en;q=0.2
      Connection
      	keep-alive
      Cookie
      	Idea-95cd11fd=08f684ec-da40-4193-a75c-d5dfc05b8248
      Host
      	localhost:63342
      Referer
      	http://localhost:63342/itcast/day_15Servlet/servlet/demo03.html?usename=ssssss
      Upgrade-Insecure-Requests
      	1
      User-Agent
      	Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
    
    • ​ User-Agent :浏览器信息
      • Referer: 告诉服务器从哪里来的
        • 作用:防盗链
        • ;2统计工作
  • 请求空行

  • 用于分割post请求的请求头和请求体的;

  • 请求体

    • ​ 封装post请求消息的请求参数

一 requset:请求

1获取请求信息

这个是一个接口,HttpServletRequset也是一个tomacat的源码中的一个接口;

功能:

  • 获取请求行数据

    • "GET /day/14/demo ?name=张三 HTTP:1.1

    • 方法:

      • javax.servlet.http 接口 HttpServletRequest

      • 1获取方式 String getMethod()

      • 获取虚拟目录:String getContextPath()

      • Servlet的路径 :String getServletPath()

      • 请求参数

      • 获取URI:

        • String getRequsetURI();
        • String getRequsetURL();长一点
       String contextPath = request.getContextPath();
       //虚拟目录
       System.out.println(contextPath);
      
       System.out.println(request.getMethod());
       //小的路径
       System.out.println(request.getServletPath());
       //大的范围,共和国
       System.out.println(request.getRequestURI());
       //中华共和国 
       System.out.println(request.getRequestURL() );
       //参数
      // System.out.println(request.getQueryString());
       //版本http的
       System.out.println(request.getProtocol());
       //IP地址
       System.out.println(request.getRemoteAddr());
      
  • 获取请求头数据

    1.   Enumeration<String> headerNames = request.getHeaderNames();
       while (headerNames.hasMoreElements())
        {
            String s = headerNames.nextElement();
            String header = request.getHeader(s);
           // System.out.println(s+ header);
        }
        String ss = request.getHeader("user-agent");
        boolean contains = ss.contains(("firefox"));
        if (contains){
            System.out.println("是火狐");
        }else {
            System.out.println("不是");
        }
        System.out.println("多对多");
      
  • 请求体数据

    • 只有在post 才会有请求体数据

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    BufferedReader reader = request.getReader();
    String line= null;
    while ((line=reader.readLine())!=null){
        reader.readLine();
    }
    System.out.println("哈哈");
    }
    
2其他请求方式:

parameter:参数

字符缓存流请求和参数请求:psot和get的request接口都可以使用的方法;

(1)String usename = request.getParameter(“usename”);

常用1

(2)Enumeration parameterNames = request.getParameterNames();

不常用,因为会把一部分具有同名属性的不打印出来

Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
    String name= parameterNames.nextElement();
    System.out.println(name);
    String values = request.getParameter("name");
    System.out.println(values);
    System.out.println("----------");

(3)request.getParameterMap();

常用,可以都打印出来

package request;

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.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/RequestDemo03")
public class RequestDemo03 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        BufferedReader reader = request.getReader();
        String line= null;
        while ((line=reader.readLine())!=null){

            System.out.println(line);
        }
        System.out.println("哈哈");
        System.out.println("post");
        String usename = request.getParameter("usename");
        System.out.println(usename);
        String[] habbies = request.getParameterValues("hibby");
        for (String habb : habbies
        ) {
            System.out.println(habb);
        }
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()){
            String name= parameterNames.nextElement();
            System.out.println(name);
            String values = request.getParameter(name);
            System.out.println("----------");
        }


    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("连接成功打印DOET");
        //获取请求参数
      /*  String usename = request.getParameter("usename");
        System.out.println(usename);
*/
      this.doPost(request,response);


    }
}
3在tomacat的页面输入中文,在post方式访问,tomacat会乱码,post不会,

解决方法:

request.setCharacterEncoding(“utf-8”);

request.setCharacterEncoding("utf-8");
 String usename = request.getParameter("usename");
 System.out.println(usename);
4请求转发:一种在服务器之间跳转资源的方法

第一种跳转方法:

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RequestDemo03");
requestDispatcher.forward(request,response);

转发特点:

  1. ​ 浏览器地址不会改变
  2. ​ 只能访问同一个服务器中
  3. 转发是同一次请求
@WebServlet("/RequestDemo04")
public class RequestDemo04 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       request.setCharacterEncoding("utf-8");
        String usename = request.getParameter("usename");
        System.out.println(usename);
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RequestDemo03");
        requestDispatcher.forward(request,response);
5共享数据:

共享数据建立在转发的前提之下

域对象:一个有作用范围的对象

request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RequestDemo03");

​ 方法:

attribute属性

  1. ​ setattribute(String name ,String O) 存储数据
  2. getAttribute(String name)获取键取值
  3. 修改 removeAttribute(String name )
6获取 getServletContext:
7BeanUtils 的jar中的:
Map<String, String[]> map = request.getParameterMap();
BeanUtils.populate(loginUse,map);

二response响应

一:

请求消息:客服端发送给服务器的数据

响应消息:服务器发送给客户端的数据

1响应行
  • 协议./版本,响应状态码,状态描述

  • 响应码:
    • 3位数字,1XX:服务器首客服端信息,但是没接受完成

    • 2XX成功

    • 3XX:重定向,302重定向,304访问缓存

    • 4XX:客户端错误;大多数是路径错误

      • 404请求路径没有对应资源
      • 405请求方式没有的doXXX方法

      5XX:服务端的错误,500*服务器内部出现异常)

2响应头

3响应空行

4响应体

二:方法+例子

1重定向:

​ response.sendRedirect(“String address”);

2转发和重定向的区别:

**转发特点:**forward,

用Request实现,叫内重定向,

  1. ​ 浏览器地址不会改变
  2. ​ 只能访问同一个服务器中
  3. 转发是同一次请求;可以使用request对象的域共享数据;(requst.getAttrubuter)

**重定向的特点:**redict

用response实现;叫外重定向,

  1. 地址栏发生变化
  2. 可以不是同一个服务器下的;
  3. 是两次请求.所有不能使用域共享数据;

4路径的写法:

1相对路径:

  • ./当前目录
  • …/后退一级

2绝对路径:

(不用加http://localhost/).->写./day155/RsponseDemo02

以斜杠开头的/;

(2)规则:判断给谁用:

  • 虚拟路径:就是本项目的名称:/day155_war_exploded;一般建议动态获取
  • 动态获取虚拟路径:request.getContextPath();
  1. 给客户端浏览器使用的:需要加虚拟目录;

​ 重定向:重定向就是这种的,A把B的访问路径返回给浏览器使用,再次访问BServlet服务器的资源;

​ 超链接,form表单路径,都是给客服端用的;

2给服务器使用:不用加虚拟目录;

​ 转发:Servlet在内部转发的时候就是这种;

5中文乱码问题

获取的流默认为ISO-8859-1;

获取的流或者浏览器解析的编码都会引起乱码问题;

在获取流之前,加上这行代码:

//1
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");



//2
PrintWriter writer = response.getWriter();
        writer.write("中国你好 Chinese");
        writer.write("未来之星");
        writer.write("<h1>hello response<h1>");

对于字符流的处理:

ServletOutputStream writer = response.getOutputStream();
writer.write("中国的你好 Chinese".getBytes("utf-8"));

6ServletContext对象

1概念:代表整个Web应用;可以和程序的容器来通信;

ServletContext servletContext = this.getServletContext();
ServletContext servletContext1 = request.getServletContext();

2功能:

  • 获取MIME类型
    • MIme类型;一种 ****通信的一种文件数据类型, Text/html
  • 域对象
  • 获取文件的真是(服务器)路径

(1)获取MIME类型

  •   ServletContext servletContext = this.getServletContext();
      ServletContext servletContext1 = request.getServletContext();
      //servletContext.getMimeType("filename");
    

String filename =“a.jpg”;
String mimeType = servletContext.getMimeType(filename);
System.out.println(mimeType);
```

**通信的一种文件数据类型, Text/html**

(2)共享数据

  • servletContext.getAttribute("ss");  //1.class
    servletContext.setAttribute("ss","dd");//2.class
    

(3)

  • ​ 获取文件的真实(服务器)路径f

    //获取文件的服务器路径
    
    String realPath = servletContext.getRealPath("/a.text");//在web文件夹下的文件
    servletContext.getRealPath("/WEB-INF/b.text");//在web文件夹下的WEB-INF下的文件
    servletContext.getRealPath("/WEB-INF/classes/c.text");//在src下的路径位置下的文件
    

7下载文件时弹出的中文名乱码

(1)在每个浏览器对应的文件中文名字乱码,可以网上找工具类,然后导入request.getHeader(“user-agent”),返回的agent,用工具类再次getFileName(agent,filename);返回新的filename.

(2)在用response.setHeader(“content-disposition,attachement;filename=”+ 新filname)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值