Servlet和tomcat

Servlet和tomcat

在使用注解的时候,这个位置一定要加斜杠

这个位置一定要加斜杠,不然就会出现这个问题

在Servlet的学习中,记录碰到的问题,以免以后碰到又忘了

image-20220902163556758

映射无效异常

没加/

image-20220902165005171

Tomcat的webapps目录

tomcat加载的项目都存放在webapps目录下

默认是加载webapps下所有项目,通过项目地址访问项目

webapps下有ROOT目录,是默认打开的(不需要输入项目名称)

image-20220905145244946

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

Servlet的生命周期

Servlet没有main()方法,不能独立运行,它的运行完全由Servlet引擎来控制和调度。生命周期,指的是Servlet容器何时创建Servlet实例,何时调用其方法进行请求的处理,何时销毁其实例的整个过程

init()初始化方法

系统方法—服务器自动调用

当请求到达Servlet容器时,Servlet容器会判断该Servlet对象是否存在,如果不存在,则创建实例并初始化

初始化方法只会执行一次

就绪/服务方法(处理请求数据)

系统方法—服务器自动调用

当有请求到达Servlet时,就会调用该方法

方法可以被多次调用

destory()销毁方法

系统方法—服务器自动调用

当服务器关闭或者应用程序停止时,调用该方法

方法只会执行一次

image-20220905193020326

image-20220905193246982

//获取请求时的完整路径(从HTTP开始,到"?"前结束
String s = req.getRequestURL().toString();
System.out.println("url:"+s);
//获取请求时的部分路径(从项目的站点名开始,到"?"前面结束
String requestURI = req.getRequestURI();
System.out.println("uri:"+requestURI);
//获取请求时的参数字符串(从"?"后面开始,到最后的字符串)
String queryString = req.getQueryString();
System.out.println("queryString:"+queryString);
//获取请求方式(GET和POST)
String method = req.getMethod();
System.out.println("method:"+method);
//获取当前协议版本(HTTP/1.1)
String protocol = req.getProtocol();
System.out.println("protocol:"+protocol);
//获取项目的站点名(项目对外访问路径)
String contextPath = req.getContextPath();
System.out.println("contextPath:"+contextPath);
//获取指定名称的参数值,返回字符串
String userName1 = req.getParameter("userName");
//获取指定名称的参数对应的所有参数值,返回字符串数组(用于复选框传值)
String[] userNames = req.getParameterValues("userName");

image-20220905200842698

image-20220905201054314

HttpServletRequest请求乱码问题

GET请求

  • Tomcat8及以上版本不会乱码
  • Tomcat7及以下会乱码

POST请求

  • Tomcat都乱码

  • //通过该方法解决
    resp.setCharacterEncoding("utf-8");
    

请求转发

请求转发,是一种服务器的行为,当客户端请求到达后,服务器进 行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改 变,得到响应后,服务器端再将响应发送给客户端,从始至终只有 一个请求发出。 实现方式如下,达到多个资源协同响应的效果

请求转发的特点:

  1. 服务端行为
  2. 地址栏不发生改变
  3. 从始至终只有一个请求
  4. request数据可以共享
request.getRequestDispatcher(url).forward(request
,response);

request作用域(request域对象)

request对象中的数据可以被客户端所获取

通过该对象可以在一个请求中传递数据

作用范围:在一次请求中有效,即服务器跳转(请求转发)中有效。

request 域对象中的数据在一次请求中有效,则经过请求转发

request 域中的数据依然存在,则在请求转发的过程中可以通过

request 来传输/共享数据

浏览器访问每一个Servlet时都是一个新的HttpServletRequest请求

只有请求转发的两个Servlet可以共享一个HttpServletRequest

响应数据

接收到客户端请求后

可以通过 HttpServletResponse 对象直接进 行响应,响应时需要获取输出流

有两种形式:

getWriter() 获取字符流(只能响应回字符)

getOutputStream() 获取字节流(能响应一切数据)

响应回的数据到客户端被浏览器解析

注意:两者不能同时使用。

// 字符输出流
PrintWriter writer = response.getWriter();
writer.write("Hello");
writer.write("<h2>Hello</h2>");

// 字节输出流
ServletOutputStream out =
response.getOutputStream();
out.write("Hello".getBytes());
out.write("<h2>Hello</h2>".getBytes());

//设置响应类型,默认是字符串
// 设置响应MIME类型
response.setHeader("content-type","text/html");

重定向

重定向是一种服务器指导,客户端的行为

客户端发出第一个请 求,被服务器接收处理后,服务器会进行响应,在响应的同时,服 务器会给客户端一个新的地址(下次请求的地址 response.sendRedirect(url);)

当客户端接收到响应后,会立 刻、马上、自动根据服务器给的新地址发起第二个请求,服务器接 收请求并作出响应,重定向完成

从描述中可以看出重定向当中有两个请求存在,并且属于客户端行为。

// 重定向跳转到index.jsp
response.sendRedirect("index.jsp");

通过观察浏览器我们发现第一次请求获得的响应码为 302,并且含 有一个 location 头信息。并且地址栏最终看到的地址是和第一次请 求地址不同的,地址栏已经发生了变化

重定向存在两次请求,不存在参数共享

区别

请求转发只能找当前项目下的资源,重定向可以找外部资源
存在,并且属于客户端行为。**

// 重定向跳转到index.jsp
response.sendRedirect("index.jsp");

通过观察浏览器我们发现第一次请求获得的响应码为 302,并且含 有一个 location 头信息。并且地址栏最终看到的地址是和第一次请 求地址不同的,地址栏已经发生了变化

重定向存在两次请求,不存在参数共享

区别

请求转发只能找当前项目下的资源,重定向可以找外部资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值