草庐IT

2022-8-30 servlet

ychptz 2023-04-16 原文

HttpServletRequest --- request(请求)

所有的 和请求相关的操作,都用这对象来处理
当有请求来的时候 , request就被实例化

HttpServletResponse --- response(响应)

所有和响应相关的操作,都用这个对象来处理
当有请求来的时候 , response 就被实例化
当你想要给出响应就使用 response ,,  我们给出的响应,必须要展示在客户端(浏览器)

init方法什么时候执行?

 * 默认当我们第一次访问servlet的时候被调用,延迟加载。
 * 初始化方法只执行一次。
public class HelloServlet extends HttpServlet {
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("servlet初始化");
		System.out.println(config.getInitParameter("username"));
		System.out.println(config.getInitParameter("password"));
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req,resp);
	}
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收参数 ,处理请求
		  request.getParameter("username");
		  request.getParameter("password");
		  // 给出响应
		// 客户端和服务器端的信息传递
		// 设置响应的字符集   一定要放在获取流之前
		// 服务器处理字符串按照UTF-8处理
		response.setCharacterEncoding("utf-8");
		// 添加响应头,告诉浏览器以HTML的格式来解析响应字符串
		response.addHeader("content-type","text/html;charset=utf-8");
		//Io流
		PrintWriter writer = response.getWriter();
		//向客户端回复数据
		writer.write("我是后台返回的数据");
		   //  * writer.write---写字符。
		   //  * writer.print---写字节。
		//流的操作
		writer.flush();
		writer.close();
	}
}

System.out.println("请求的方法:" + request.getMethod());
System.out.println("请求的根路径:" + request.getContextPath());
System.out.println("请求的URI:" + request.getRequestURI());
System.out.println("请求的URL:" + request.getRequestURL());
System.out.println("请求的servletPath:" + request.getServletPath());

@WebServlet("/demo.do")
public class Demo01Servlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 根据key获取对应的value
	   request.getParameter("");
		// 获取一个key对应的多个值,返回值为String类型的数组  例如:复选框
	   String[] hobbies = request.getParameterValues("hobby");
//        System.out.println(Arrays.toString(hobbies));

    // 获取请求中传过来的参数的key值,根据key值获取对应的value值
   Enumeration<String> parameterNames = request.getParameterNames();
   while(parameterNames.hasMoreElements()){
       System.out.println(parameterNames.nextElement());
   }
    // 可以获取到请求中的所有的键值对,返回值是一个map集合
    // 这个map集合的key是String,value是String[]
    // username=admin,password=123456,hobby=a,b,c,gender=man
    Map<String, String[]> map = request.getParameterMap();
    for (Map.Entry<String, String[]> name : map.entrySet()) {
        String key = name.getKey();
        String[] value = name.getValue();
        System.out.println(key + "--->" + Arrays.toString(value));
    }
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request,response);
}

}

转发 request.getRequestDispatcher("demo03.do").forward(request,response);

@WebServlet("/demo02.do")
public class Demo02Servlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		* 请求转发---由多个servlet来处理同一个请求
		*
		* 请求转发是在服务器上完成的,跟客户端是否无关!!!
		*
		*
		*/
		String name = request.getParameter("name");
		System.out.println("Demo02Servlet,name:" + name);
		// getRequestDispatcher参数:转发的servlet的地址
		// forward参数:request,response,把当前servlet用的request和response传给下一个
		request.getRequestDispatcher("demo03.do").forward(request,response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

@WebServlet("/demo04.do")
public class Demo04Servlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
    * 作用域:起作用的区域
    *
    * 往request作用域中添加了一个属性name,值是zhangsan
    *
    * 请求转发的时候是同一个request
    *
    */
    request.setAttribute("name","zhangsan");
    // name怎么取出来?
    System.out.println("demo04.do---name:" + request.getAttribute("name"));
    request.getRequestDispatcher("demo05.do").forward(request,response);

//        根据指定的key,删除对应的value
//        request.removeAttribute("name");
		// 获取request作用域中的所有的key
//        Enumeration<String> attributeNames = request.getAttributeNames();


}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

    request.getRequestDispatcher("demo03.do").forward(request,response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}
}

重定向 response.sendRedirect("success.html");

@WebServlet("/demo06.do")
public class Demo06Servlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	   response.getWriter()
	   response.setCharacterEncoding("utf-8");
	   response.addHeader("content-type","text/html;charset=utf-8");
	   response.sendRedirect("success.html");

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

请求转发和重定向的区别:

        1.重定向是两次请求,请求转发是一个请求
        2.重定向是客户端行为,请求转发是服务器行为
        3.重定向浏览器地址会发生改变,转发不会

最常见的客户端传参的方式两种,get,post

 * 浏览器地址栏直接输入:一定是get请求
 * 超级链接:一定是get请求
 * 表单:可以是get,也可以是post,取决于method
 *
 * GET请求和POST请求的区别:
 * GET:请求的参数会在浏览器的地址栏中显示,不安全;请求的长度限制在1K之内。
 *      没有请求体,无法通过request去设置一些参数。
 * POST:请求的参数不会在浏览器的地址栏中显示,相对安全。
 *       把请求的参数封装成几个数据报文(请求体)。请求参数的长度没有限制。

有关2022-8-30 servlet的更多相关文章

  1. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  2. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  3. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  4. ruby-on-rails - 30.seconds.ago 之类的东西是如何实现的? - 2

    我发现了这个问题here.并且非常想知道如何在Rails中实现类似30.seconds.ago的技术解释。方法链?Numeric用法如下:http://api.rubyonrails.org/classes/Numeric.html#method-i-seconds.还有什么? 最佳答案 Here是seconds的实现:defsecondsActiveSupport::Duration.new(self,[[:seconds,self]])end并且,here是ago的实现:#CalculatesanewTimeorDatethat

  5. ruby - 使用 Ruby 作为脚本语言,使用 4gb RAM 的计算机对 30gb 的字符串进行排序的最佳方法是什么? - 2

    您好,我将其视为一个面试问题,并认为这是一个有趣的问题,但我不确定答案。最好的方法是什么? 最佳答案 假设*nix:system("sortoutput_file")“排序”可以使用临时文件来处理大于内存的输入文件。如果需要,它有开关来调整主内存的数量和它将使用的临时文件的数量。如果不是*nix,或者面试官因为斜着回答皱眉,那我就编码一个外部mergesort.请参阅@psyho的回答以获得外部排序算法的良好总结。 关于ruby-使用Ruby作为脚本语言,使用4gbRAM的计算机对30g

  6. 2022年10月23日周赛ZZULIOJ - 2

    文章目录问题B:芝华士威士忌和他的小猫咪们代码&注释问题C:愿我的弹雨能熄灭你们的痛苦代码注释问题D:猜糖果游戏代码注释问题E:有趣的次方代码注释问题F:这是一个简单题代码&注释问题G:打印矩阵代码注释问题H:scz的简单考验代码注释问题I:完美区间代码&注释问题J:是狂热的小迷妹一枚吖~代码&注释2022年10月23日周赛ZZULIOJ问题B:芝华士威士忌和他的小猫咪们时间限制:1Sec内存限制:128MB题目描述芝华士威士忌很喜欢带着他的猫咪们一块跑着玩。但是小猫咪们很懒,只有在离他y米以内才愿意和他一块跑。这天他在坐标为x的位置,他想和他的猫咪们一块跑着玩。有n个小猫咪,第i个小猫咪在坐

  7. 【华为OD机试真题 java、python、c++】荒地电站建设【2022 Q4 100分】(100%通过+复盘思路) - 2

    代码请进行一定修改后使用,本代码保证100%通过率,本题目提供了java、python、c++三种代码。复盘思路在文章的最后题目描述祖国西北部有一片大片荒地,其中零星的分布着一些湖泊,保护区,矿区;整体上常年光照良好,但是也有一些地区光照不太好。某电力公司希望在这里建设多个光伏电站,生产清洁能源对每平方公里的土地进行了发电评估,其中不能建设的区域发电量为0kw,可以发电的区域根据光照,地形等给出了每平方公里年发电量x千瓦。我们希望能够找到其中集中的矩形区域建设电站,能够获得良好的收益。输入描述第一行输入为调研的地区长,宽,以及准备建设的电站【长宽相等,为正方形】的边长最低要求的发电量之后每行为

  8. 玩客云刷机(2022-3-19亲测) - 2

    https://cloud.189.cn/t/BJbYreYbmUj2(访问码:djz6)(网盘2022-4-1更新)一、刷入armbian。1.1使用AmlBurnTool软件烧录首选底包至固件。烧录完成后断开玩客云电源备用。(靠近hdmi的那个口子。)1.2使用WIn32diskimager软件将emmc固件写入U盘。1.3写入成功后,先将U盘插入玩客云靠近网线接口端的USB口,再接入电源。玩客云通电后指示灯会先亮绿灯,再亮蓝灯,红蓝闪烁,最后蓝灯常亮。等到确定蓝灯常亮后,再拔掉U盘、电源。(最好蓝灯常亮后,启动一次玩客云,看看ssh是否正常。)1.4使用WIn32diskimager写入

  9. AiBote 2022 新研发的自动化框架,支持 Android 和 Windows 系统。速度非常快 - 2

    Ai-Bot基于流行的Node.js和JavaScript语言的一款新自动化框架,支持Windows和Android自动化。1、Windowsxpath元素定位算法支持支持Windows应用、.NET、WPF、Qt、Java和Electron客户端程序和ie、edgechrome浏览器2、Android支持原生APP和H5界面,元素定位速度是appium十倍,无线远程自动化操作多台安卓设备3、基于opencv图色算法,支持找图和多点找色,1080*2340全分辨率找图50MS以内4、内置免费OCR人工智能技术,无限制获取图片文字和找字功能。5、框架协议开源,除官方node.jsSDK外,用户可

  10. ruby - 检查 9.30 到 4 ruby 之间的时间 - 2

    我有一个代码错误地生成了它,我认为必须有更好的方法来检查时间>9.30am和时间defcheckTimegoodtime=falseif(Time.now.hour>9andTime.now.min>30)thenif(Time.now.hour9andTime.now.hour 最佳答案 t=Time.nowRange.new(Time.local(t.year,t.month,t.day,9),Time.local(t.year,t.month,t.day,16,30))===t 关

随机推荐