Servlet和tomcat
在使用注解的时候,这个位置一定要加斜杠
这个位置一定要加斜杠,不然就会出现这个问题
在Servlet的学习中,记录碰到的问题,以免以后碰到又忘了
映射无效异常
没加/
Tomcat的webapps目录
tomcat加载的项目都存放在webapps目录下
默认是加载webapps下所有项目,通过项目地址访问项目
webapps下有ROOT目录,是默认打开的(不需要输入项目名称)
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()销毁方法
系统方法—服务器自动调用
当服务器关闭或者应用程序停止时,调用该方法
方法只会执行一次
//获取请求时的完整路径(从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");
HttpServletRequest请求乱码问题
GET请求
- Tomcat8及以上版本不会乱码
- Tomcat7及以下会乱码
POST请求
Tomcat都乱码
//通过该方法解决 resp.setCharacterEncoding("utf-8");
请求转发
请求转发,是一种服务器的行为,当客户端请求到达后,服务器进 行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改 变,得到响应后,服务器端再将响应发送给客户端,从始至终只有 一个请求发出。 实现方式如下,达到多个资源协同响应的效果
请求转发的特点:
- 服务端行为
- 地址栏不发生改变
- 从始至终只有一个请求
- 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 头信息。并且地址栏最终看到的地址是和第一次请 求地址不同的,地址栏已经发生了变化
重定向存在两次请求,不存在参数共享
区别
请求转发只能找当前项目下的资源,重定向可以找外部资源