JavaWeb-Tomcat,Servlet重点

本文详细介绍了Tomcat的目录结构、启动与停止方法,部署web工程过程,以及Servlet的基础概念、生命周期、请求分发与重定向。还涉及HTTP协议、HttpServletRequest和HttpServletResponse的使用,以及关键概念如ServletConfig和serveltContent。
摘要由CSDN通过智能技术生成


Tomcat

目录介绍

Bin      存放Tomcat服务器的可执行程序
Conf     存放Tomcat服务器的配置文件
Lib      存放Tomcat服务器的jar包
Logs     存放Tomcat服务器的运行时输出的日记
Webapps  存放部署的工程
Work     是Tomcat工作时的目录,存放Tomcat运行时jsp翻译为Servlet的源码。

打开与测试

打开Startup.bat,要配置好环境变量
如何测试
浏览器输入:http://localhost:8080,有tomcat页面

停止Tomcat

1.点击Tomocat的cmd关闭按钮
2.把Tomcat服务窗口置为当前窗口,然后ctrl+c
3.找到Tomcat的bin目录下的shutdown.bat双击,即可停止
如何修改Tomcat的端口号:
找到Tomcat目录下的conf目录,找到server.xml配置文件

修改完要重启Tomcat

部署web工程到Tomcat中

1.把web工程的目录拷贝到Tomcat的webapps目录即可
http://localhost:8088/项目文件下的html

2.找到tomcat的conf\Catalina\localhost 下,创建配置文件xml
Context path="/abc"
docBase=“D:\book” />

http://localhost:8088/abc

默认打开ROOT工程,默认index.html
Tomcat部署到idea内
在这里插入图片描述
在这里插入图片描述

项目t添加jar包

在web下的web-inf下建立lib,把jar拉进去,然后add to libray
可以在Edit Configition里面修改端口号,项目,默认浏览器等数据

Servlet

servlet是javaee规范之一
Servlet是javaweb三大组件之一 listener filter

Servlet是运行在服务器的一个java小程序,接收请求,响应数据给客户端
手动实现Servlet程序

Servlet加入流程

1编写一个类去实现servlet接口,一般实现Httpservlet接口,后面学到反射,就直接继承BaseServlet即可
2实现servlet方法,处理请求,响应数据
3 到web.xml去配置servlet程序的访问地址

Servlet生命周期

1 构造器方法
2 init初始化方法
在访问的时候创建servlet会调用,之后访问不会再调用
3 servlet方法
每次访问都调用此方法
4 destory方法
在停止的时候调用

请求的分发处理

get post请求方式
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println(“hello servlet 被访问了”);
//类型转换,因为它有getMethod方法
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String method = httpServletRequest.getMethod(); //获取请求协议的请求方式 get/post
System.out.println(method);

if(method.equals("GET")){
    System.out.println("get请求");
}
else if(method.equals("POST")){
    System.out.println("post请求");
}

}

一般在实际项目中,都是继承HttpServlet类的方式实现Servlet程序
HttpServlet实现了Servlet类内的servlet方法,就可以实现doget和dopost方法

1编写一个类去继承HttpServlet类
2重写doGet()或doPost()方法
3 到web.xml去配置servlet程序的访问地址

ServletConfig

每个servlet有不同的一个servletConfig类
三大作用:

  • 1.可以获取servlet程序的别名servlet-name的值
  • 2.获取初始化参数init-param
  • 3.获取serveltContent对象
   @Override
    public void init(ServletConfig servletConfig) throws ServletException {
//        三大作用:
//        1.可以获取servlet程序的别名servlet-name的值
        System.out.println(servletConfig.getServletName());
//        2.获取初始化参数init-param
        System.out.println("初始化的username值:"+servletConfig.getInitParameter("username"));
//        3.获取serveltContent对象
        System.out.println(servletConfig.getServletContext());
    }

serveltContent

1是一个接口,表示servlet上下文对象
2一个web工程,只有一个serveltContent对象
3 serveltContent是一个域对象

四个作用

  • 1获取web.ml配置的上下文参数context.param
  • 2获取当前的工程路径,格式:/工程路径
  • 3获取工程部署后在服务器硬盘上的绝对路径
  • 4像Map一样存取数据
//        1获取web.ml配置的上下文参数context.param
        ServletContext context = getServletConfig().getServletContext();
        System.out.println("oookkk");
        String name = context.getInitParameter("name");  /*只能获取context-param下的属性值*/
        System.out.println(name);
//        2获取当前的工程路径,格式:/工程路径
        System.out.println("当前的工作路径:"+context.getContextPath());
//        3获取工程部署后在服务器硬盘上的绝对路径
        System.out.println("工程部署的路径是:"+context.getRealPath("/"));
//        4像Map一样存取数据

//4.存取数据
ServletContext context = getServletContext(); //获取Servletcontext对象
context.setAttribute("key1","value1");
System.out.println(context.getContext("key1"));

存好的数据,在任何一个servlet内都能通过context获取到新存数据的value值

HTTP协议

GET POST 请求方式

哪些是GET请求:

  • 1.form标签 method = get
  • 2.a 标签
  • 3.Link标签引入css
  • 4.Script标签引入js文件
  • 5.Img标签引入图片
  • 6.Iframe引入html页面
    -7.在浏览器地址栏中输入地址后敲回车

哪些是post请求:

  • 8.form标签 method = post

请求响应协议格式

响应码说明:
200 请求成功
302 请求重定向
404 请求服务器收到了,要的数据不存在(地址错了)
500 表示服务器收到请求,但是服务器内部错误(代码错误)

谷歌查看http协议:
在这里插入图片描述

HttpServletRequest

作用:
每次只要有请求加入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装给Request对象,然后传递到service的get,post方法。我们可以通过HttpServletRequest对象,获取请求的信息。

常用方法:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("123");
    //1 getRequestURI()   获取请求的资源路径
    System.out.println("URI-->"+req.getRequestURI());
    //2.getRequestURL()   获取请求的统一资源定位符
    System.out.println("URL-->"+req.getRequestURL());
    //3.getRemoteHost()   获取客户端的ip地址
    System.out.println("客户端的ip地址:"+req.getRemoteHost());
    /*
    * 在idea中,使用localhost访问时,得到地址是127.0.0.1
    * 如果使用真实ip访问,得到的客户端地址就是真实ip地址
    */
    //4.getHeader()       获取请求头
    System.out.println("请求头-->"+req.getHeader("User-Agent"));


}

获取请求的参数值

//获取请求的数据值
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobby = req.getParameterValues("hobby");

System.out.println(username+" "+password+" "+ Arrays.asList(hobby));
结果:

Request请求的转发*

服务器收到请求后,从一个资源跳转到另一个资源的操作,可以传递request请求的参数内容
Servlet程序1获取请求参数,处理业务,加盖一个章,走到servlet2程序
Servlet程序2获取请求参数,检查有没有servlet1的章,处理自己的业务

public class Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数
        String username = req.getParameter("username");
        System.out.println("在servlet1查看参数"+username);

        //给材料盖一个章,并传递到servlet2查看
        req.setAttribute("key","柜台1的章");

        //问路 servlet2怎么走
        //请求转发必须以/打头,斜杆表示:http://ip:port/工程名/,映射到idea代码的web目录
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");

        //走向servlet2
        requestDispatcher.forward(req,resp);
    }
}
public class Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数
        String username = req.getParameter("username");
        System.out.println("在servlet1查看参数"+username);

        //查看是否有盖章
        Object key1 = req.getAttribute("key");
        System.out.println("柜台1是否有章"+key1);

        //处理自己的业务
        System.out.println("servlet2 处理自己的业务");
        }
}

请求转发的特点:

  • 1.浏览器地址栏没有变化
  • 2.他们是一次请求
  • 3.他们共享request域内的数据
  • 4.可以转发到web-inf目录下
 1.<url-pattern>/servlet1</url-pattern>
System.out.println("工程部署的路径是:"+context.getRealPath("/")); //web文件夹映射后的

req.getRequestDispatcher("/");

特殊情况:
Response.sendRedirect(“/”); 把斜杆发送给客户端解析

HttpServletRsponse

作用
每次请求进来,都会创建一个Response对象给servlet程序使用,表示响应信息
如果需要设置返回给客户的信息,都可以通过response对象来设置

输出流
字节流或者字符流,不能同时使用,会报错500

resp.getWriter();
resp.getOutputStream();
如何回传数据
writer.write(“response’s content!!!”);
解决数据乱码问题
resp.setContentType(“text/html; charset=UTF-8”);

Response请求重定向*

指客户端给服务器发送请求,服务器告诉客户端说我给你一些地址,你去新地址访问,叫请求重定向(因为之前的地址可能已经被废弃)

客户端访问第一个response程序,因为这个程序已经被废弃了,不过有义务告诉客户端:响应码: 302, 响应头:Location 新的response的地址
客户端接收到新地址,就去新地址访问

public class Response1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("曾到此一流 Response1 ");
//         //设置响应状态码,表示重定向
//         resp.setStatus(302);
//        //设置响应头,说明新的地址在哪
//         resp.setHeader("Location","http://localhost:8088/_07servlet/response2");
        
        //302是固定的,所以直接设置新地址即可
        resp.sendRedirect("http://localhost:8088/_07servlet/response2");
    }
public class Response2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("到此 response2");
        resp.setContentType("text/html;charset:UTF-8");
        resp.getWriter().write("response2's result!");
    }
}

这样访问response1的时候就会跳转到response2
特点:

  • 1浏览器地址栏会变化
  • 2两次请求
  • 3请求重定向不共享request中的数据,跟请求的转发中request共享是不同的
  • 4无法直接访问WEB-INF下的文件
  • 5可以访问外部的URL地址(百度)

Base标签

可以设置一个当前页面中所有相对页面工作时,参照这个路径来跳转

<base href="http://localhost:8088/_07servlet/a/b/">

Web中斜杠的不同意义

在web中,/是一种绝对路径
如果被浏览器解析,得到的地址是 http://ip:port

如果被服务器解析,得到的地址是 http://ip:port/工程路径

以后的请求一般都是重定向,除非要回传数据,出现页面跳转的话,就用重定向,这样就不会有按F5出现多次发送请求的BUG

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值