JavaWeb笔记
1.可以通过创建一个类实现Servlet并重写所有方法
2.也可以通过继承HttpServlet重写init、service、destroy方法
配置web.xml映射文件和类文件路径一致
浏览器访问:localhost:8080/项目名/文件名(如果是访问类直接是xml中配置的路径) 如果是表单跳转: 表单中<form>属性action指定xml中的映射路径一致 name属性是提交跳转的名称,服务器通过name的值接收
一、Servlet工作原理
-
客户端请求:
用户通过浏览器发送请求至服务器。
-
匹配Servlet:
服务器依据URL模式(web.xml或注解配置)定位对应的Servlet处理请求。
-
创建请求与响应对象:
服务器为每个请求创建
HttpServletRequest
和HttpServletResponse
对象,分别用于封装请求信息和准备响应内容。 -
调用Servlet方法
首次请求时调用
init()
进行初始化。service()方法检查请求类型并调用doGet(),doPost()等相应方法处理请求。
-
处理与响应:
在处理方法中,Servlet完成业务逻辑(如数据库交互),并通过
HttpServletResponse
返回结果给客户端。 -
销毁Servlet:
在应用卸载或服务器关闭时,调用
destroy()
方法清理资源。
二、请求和响应
Servlet中基本配置
1.request和response的字符编码
request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
2.获取表单提交的信息
假设两个name分别为username和password String username=request.getParameter("username"); String password=request.getParameter("password"); //设置响应类型,避免乱码,告诉浏览器是html内容 response.setContentType("text/html;charset=UTF-8"); 这里可以直接输出,但是是在控制台显示
PrintWriter类可以用于在客户端打印提示信息 PrintWriter out=response.getWriter();
//对接收的信息做一个异常判断,也可以通过一个工具类编写一个方法进行判断 System.out.println("this is doGet method"); if(username==null){ out.write("输入账号不合法"); } if(password==null){ //设置响应类型 out.write("输入密码不合法"); } out.flush(); out.close(); }
三、转发和重定向
转发:地址栏显示原地址不改变url,服务器内部行为,只能访问当前工程地址 request.setAttribute("message", "Hello, World!");前是转发字段,后是内容 携带数据进行转发,可以是基本数据类型和引用数据类型
接收:String name=request.getAttribute("message"); 后期需要转型可以进行强转 // 转发到另一个Servlet RequestDispatcher dispatcher = request.getRequestDispatcher("/anotherServlet"); dispatcher.forward(request, response); // 转发到一个JSP页面 RequestDispatcher dispatcher = request.getRequestDispatcher("/result.jsp"); dispatcher.forward(request, response); 重定向:地址栏为新地址,改变url,可以访问任何地址 // 重定向到另一个Servlet request.getContextPath()获取当前请求路径 response.sendRedirect(request.getContextPath() + "/anotherServlet"); // 重定向到一个JSP页面 response.sendRedirect(request.getContextPath() + "/result.jsp");
如何选择:两个请求间需要共享数据就转发,不需要则重定向 !!注:转发前不能有提交响应
四、Servlet的生命周期
当客户端首次发送第一次请求后,由容器(web服务器(tomcat)去解析请求,根据请求找到对应的servlet,判断该类的对象是否存在,不存在则创建servlet实例,调取init0)方法 进行初始化操作,初始化完成后调取service()方法,由service()判断客户端的请求方式,如果是get,则执行doGet(),如果是post则执行doPost().处理方法完成后,作出相应结果给客户端.单次请求处理完毕。 当用户发送第二次以后的请求时,会判断对象是否存在,但是不再执行init0),而直接执行service方法,调取doGet()/doPost()方法。 当服务器关闭时调取destroy()方法进行销毁。 四个过程:
(1)实例化 --先创建servlet实例
当Servlet容器启动或第一次收到对该Servlet的请求时,容器会加载Servlet类并创建其实例。这是Servlet生命周期的起点。
(2)初始化--init()
一旦Servlet实例被创建,容器就会调用init()
方法一次。此方法接收一个ServletConfig
对象作为参数,允许Servlet读取配置信息如初始化参数等
(3)处理请求 ---service()
初始化完成后,Servlet就准备好处理客户端请求了。每当有请求到达时,容器都会调用Servlet的service()
方法,并传递HttpServletRequest
和HttpServletResponse
两个对象。service()方法根据HTTP请求类型(GET, POST等)来决定调用相应的
doGet(),
doPost()`等方法进行具体的请求处理。
(4)服务终止 --destory()
在Servlet容器准备关闭或者Servlet不再需要时,容器会调用Servlet的destroy()
方法。这标志着Servlet生命周期的结束。==>销毁Servlet对象(实例)
五、HTTP的GET和POST区别
特性 | GET | POST |
---|---|---|
用途 | 用于请求数据(从服务器获取信息) | 用于提交数据到服务器(如提交表单、上传文件) |
应用场景 | 查询操作、缓存利用、书签功能 | 表单提交、文件上传、非幂等操作 |
安全性 | 较低,参数直接附加在URL中,敏感信息易暴露 | 相对较高,数据通过请求体发送 |
数据传输量 | 受限,通常不超过2048字符(因浏览器和服务器而异) | 理论上无限制,取决于服务器配置 |
缓存与书签 | 可被缓存,可收藏为书签 | 不会被缓存,不能收藏为书签 |
幂等性 | 幂等,多次相同请求产生同样的效果和结果 | 非幂等,重复请求可能导致不同结果 |