tomcat:
servlet
定义在web容器上的程序
细节
- servlet的init的方法只创建一次,则是单例的.
- 当设置-2为-1时,第一次启动就创建init()方法,
- service()方法可以执行多次
- destroy():被销毁,只执行一次;一般于执行销毁之前执行;
servlet3.0
-
支持注解配置,不需要web.xml了;
-
当然 自己用web.xml 去定义路径啥的,
-
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>
-
-
步骤:创建java.EE项目,可以不创建web.xml
-
复写方法
-
定义一个注解,定义位置路径
-
/* * Servlet路径设置 * String[] urlPatterns(), * */
-
@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长度有限制
- 不太安全(相对)
- 请求参数在请求行中,在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统计工作
- Referer: 告诉服务器从哪里来的
- User-Agent :浏览器信息
-
请求空行
-
用于分割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());
-
-
-
获取请求头数据
-
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);
转发特点:
- 浏览器地址不会改变
- 只能访问同一个服务器中
- 转发是同一次请求
@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属性
- setattribute(String name ,String O) 存储数据
- getAttribute(String name)获取键取值
- 修改 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实现,叫内重定向,
- 浏览器地址不会改变
- 只能访问同一个服务器中
- 转发是同一次请求;可以使用request对象的域共享数据;(requst.getAttrubuter)
**重定向的特点:**redict
用response实现;叫外重定向,
- 地址栏发生变化
- 可以不是同一个服务器下的;
- 是两次请求.所有不能使用域共享数据;
4路径的写法:
1相对路径:
- ./当前目录
- …/后退一级
2绝对路径:
(不用加http://localhost/).->写./day155/RsponseDemo02
以斜杠开头的/;
(2)规则:判断给谁用:
- 虚拟路径:就是本项目的名称:/day155_war_exploded;一般建议动态获取
- 动态获取虚拟路径:request.getContextPath();
- 给客户端浏览器使用的:需要加虚拟目录;
重定向:重定向就是这种的,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)