Servlet
2023-12-15 04:08:58
一、Servlet技术
1.什么是Servlet?
- Servlet 技术就是JavaEE的规范之一。规范就是接口。
- Servlet就javaWeb三大组件之一。三大组件分别是:Servlet程序,Filter过滤器,Listenner监听器
Servlet是运行在服务器上的一个java程序,它可以接受客户端发送来的请求,并响应数据给客户端。
2.Servlet的生命周期
- 1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象(通过loadOnStartup=1注解配置? ?负整数: 第一次被访问时创建Servlet对象? ?0或正整数 服务器启动时创建,数字越小优先级越高? ?)
- 2.执行init初始化方法(该方法只调用一次)
- 3.请求处理:执行service方法(请求处理每次访问都会调用)
- 4.服务终止:执行destroy销毁方法(web工程结束时调用)
3.Servlet 对象由谁创建?Servlet 方法由谁调用?
Servlet对象由Web服务器创建,Servlet方法由web服务器调用。
4.Servlet体系结构
5.ServletURLpattern 配置规则
1.精确匹配
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
/**
* URL配置
*
* 一个URL可以配置多个访问路径
* 1.精确匹配
*/
@WebServlet(urlPatterns ="/user/select")
public class ServletDemo8 extends MyServlet {
@Override
protected void doPost(ServletResponse res, ServletRequest req) {
System.out.println ("demo8 get....");
}
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println ("demo7 post....");
}
}
2.目录匹配? ("/user/*")
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
/**
* URL配置
*
* 一个URL可以配置多个访问路径
* 2.目录匹配
*/
@WebServlet(urlPatterns ="/user/*")
public class ServletDemo9 extends MyServlet {
@Override
protected void doPost(ServletResponse res, ServletRequest req) {
System.out.println ("demo9 post....");
}
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println ("demo9 get....");
}
}
3.扩展名匹配(不能加 / ?*.do )
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
/**
* URL配置
*
* 一个URL可以配置多个访问路径
* 3.扩展名匹配(不能加 / *.do )
*/
@WebServlet(urlPatterns ="*.do")
public class ServletDemo10 extends MyServlet {
@Override
protected void doPost(ServletResponse res, ServletRequest req) {
System.out.println ("demo10 post....");
}
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println ("demo10 get....");
}
}
4.任意匹配? ? ? ?(1. / ? ?2./* ? /* 的优先级高于 /)
/**
* URL配置
*
* 一个URL可以配置多个访问路径
* 4.任意匹配 1. / 2./* /* 的优先级高于 /
*/
@WebServlet(urlPatterns ="/*")
public class ServletDemo11 extends MyServlet {
@Override
protected void doPost(ServletResponse res, ServletRequest req) {
System.out.println ("demo12 post....");
}
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println ("demo12 get....");
}
}
6.Request(请求) & Response(响应)
- Request :获取请求数据
- Response:设置响应数据
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "ServletTest", value = "/abc")
public class ServletTest extends HttpServlet {
@Override
//在get请求时调用
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("HelloServlet的doGet方法");
//使用request 对象 获取请求数据
String name =request.getParameter ( "name" );
//使用 response 对象 设置响应数据
response.setHeader ( "content-type","text/html;charset=utf-8" );//设置响应头
response.getWriter ().write ( "<h1>"+name+",欢迎您!</h1>" );
}
@Override
//在post请求时调用
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("post");
}
}
1.Request 继承体系
2.Request 获取请求数据
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet(name = "RequestDemo1", value = "/RequestDemo1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method =request.getMethod ();
System.out.println (method);
String contextPath= request.getContextPath ();
System.out.println (contextPath);
StringBuffer url =request.getRequestURL ();
System.out.println (url.toString ());
String uri=request.getRequestURI ();
System.out.println (uri);
String queryString =request.getQueryString ();
System.out.println (queryString);
//-------------
//获取请求头
//user-agent:浏览器的版本信息
String header=request.getHeader ( "user-agent" );
System.out.println (header);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取post的请求体
//1.获取字符输入流
BufferedReader br=request.getReader ();
//2.读取数据
String Line =br.readLine ();
System.out.println (Line);
}
}
3.使用通用方法获取请求参数
@WebServlet(name = "RequestDemo2", value = "/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("get...");
//1.获取所有参数的map集合 获取所有值
Map<String,String[]> map = request.getParameterMap ();
for (String key:map.keySet ()
) {//username :zhangsan
System.out.print (key+":");
String [] values= map.get (key);
for (String value:values
) {
System.out.print (value+"");
}
System.out.println ();
}
//2.根据Key获取参数值,数组
String[] hobbies=request.getParameterValues ( "hobby" );
for (String hobby:hobbies
) {
System.out.println (hobby);
}
//3根据Key获取单个值
String name= request.getParameter ( "username" );
String password= request.getParameter ( "password" );
System.out.println (name);
System.out.println (password);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("post...");
//1.获取所有参数的map集合 获取所有值
Map<String,String[]> map = request.getParameterMap ();
for (String key:map.keySet ()
) {//username :zhangsan
System.out.print (key+":");
String [] values= map.get (key);
for (String value:values
) {
System.out.print (value+"");
}
System.out.println ();
}
//2.根据Key获取参数值,数组
String[] hobbies=request.getParameterValues ( "hobby" );
for (String hobby:hobbies
) {
System.out.println (hobby);
}
//3根据Key获取单个值
String name= request.getParameter ( "username" );
String password= request.getParameter ( "password" );
System.out.println (name);
System.out.println (password);
}
}
4.Request 获取请求数据
请求参数如果存在中文就会乱码
get方式发生乱码的原因(编码和解码不一致)
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
@Override
/**
* 中文乱码的问题解决方案
*
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.解决乱码 Post getReader()
request.setCharacterEncoding ( "UTF-8" );//设置字符输入流的编码
//2获取数据
String name= request.getParameter ( "username" );
System.out.println ("解决乱码前"+name);
//3.GET 获取参数的方式:getQueryString
//乱码原因:tomcat进行URL解码默认的字符集"ISO-8859-1"
//3.1 先对乱码数据进行编码:转换为字节数组
byte [] bytes =name.getBytes( StandardCharsets.ISO_8859_1 );
//3.2 字节数组解码
name =new String (bytes,StandardCharsets.UTF_8);
System.out.println ("解决乱码后"+name);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet ( request, response );
}
}
5.Request 请求转发
请求转发:是在服务器内部的资源跳转方式
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
/**
* 请求转发
*
*/
@WebServlet(name = "RequestDemo3", value = "/req3")
public class RequestDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("3333333333333");
// 存储数据
request.setAttribute ( "msg","hello" );
//转发
request.getRequestDispatcher ( "/req4" ).forward ( request,response );
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet ( request, response );
}
}
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "RequestDemo4", value = "/req4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("44444444444");
//获取数据
Object name =request.getAttribute ( "msg" );
System.out.println (name);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet ( request, response );
}
}
先执行/req3 然后转发到/req4中继续执行
6.Response对象(设置响应数据)
6.1 Response 设置响应数据功能介绍
6.2 Response 完成重定向
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "ResponseDemo1", value = "/resp1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("resp1");
//重定向
// //1.设置响应状态码
// response.setStatus ( 302 );
// //2.设置响应头Location
// response.setHeader ("Location","/resp2");
//3.简化方式完成重定向
// response.sendRedirect ( "/resp2" );
String contextPath =request.getContextPath ();
response.sendRedirect ( contextPath+"/resp2" );
System.out.println (contextPath);
request.setAttribute ("contextPath" ,contextPath );
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet ( request, response );
}
}
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.IOException;
@WebServlet(name = "ResponseDemo2", value = "/resp2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println ("resp2");
Object url=request.getAttribute ( "contextPath" );
System.out.println (url);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet ( request, response );
}
}
6.3响应字符数据
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "ResponseDemo3", value = "/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取字符输出流
response.setContentType ( "text/html;charset=utf-8" );//设置字符流的编码格式,防止中文乱码
PrintWriter writer =response.getWriter ();
//content-type 告诉浏览器将来的将数据响应是html的
// response.setHeader ( "content-type","text/html" );
writer.write ( "好好好" );//写到网页上展示
writer.write ( "<h1>aaa</h1>" );
//流不需要关闭
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet ( request, response );
}
}
6.4响应字节输出流
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet(name = "ResponseDemo4", value = "/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.读取文件
FileInputStream fis =new FileInputStream ("C:\\Users\\18726\\Documents\\CFSystem\\Crossfire20221215_0000.bmp");
//2.获取response字节输出流
ServletOutputStream os =response.getOutputStream ();
//3.完成流的copy //可以在页面上看到一张图片
byte[] buff =new byte[1024];
int len=0;
while ((len=fis.read (buff))!=-1){
os.write ( buff,0,len );
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet ( request, response );
}
}
文章来源:https://blog.csdn.net/m0_64703222/article/details/132731073
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!