代码先锋网 代码片段及技术文章聚合

request的一些笔记

技术标签: web  servlet

一、获得请求数据。
String getParameter(String name)方法得到指定名称数据,Enumeration getParameterNames()得到所有数据的名称,可以在通过迭代得到所有数据,String[] getParameterValues(String name)得到同一名称的所有数据,它返回一个String数组。此外还有很多方法,其中我觉得比较有用的是一个Map getParameterMap()方法。当我们从浏览器获得表单提交数据后,比如注册表单,我们通常会先把它封装为一个formbean,此时用这个方法就变得很方便,通过BeanUtils架包提供的populate方法把formbean对象和方法返回的map对象传进去,就可以实现map到bean的复制。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getParameter("username"));
Enumeration e=request.getParameterNames();
while(e.hasMoreElements()){
String name=(String)e.nextElement();
System.out.println(request.getParameter(name));
}

Map map=request.getParameterMap();
User user=new User();
try {
BeanUtils.populate(user, map);//用map的数据填充bean
//BeanUtils.copyProperties(bean1,bean2);//bean的拷贝
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}

}


二、request乱码问题。
浏览器再向服务器传送数据时,会查询当前页面使用的编码表,按照此编码表编码数据传给服务器,而服务器通过request得到数据,request默认查询ISO-8559编码表,两边使用不同的编码表,就出现了乱码。在获取数据之前,可以通过request.setCharacterEncoding("UTF-8")设置request采用的编码表。不过此处需要注意的是,此方法只对post方法提交的数据有用,而对get方法提交的数据无用,也就是即使你在获取数据前设置了编码方式,而数据提交方式是get,那么依然存在乱码。当然对于form表单提交方式基本都会更改为post,而超链接提交方式是get,如果超链接后带有数据,就可能出现乱码,对此解决方法有可以通过改变服务器配置解决,不过此方法基本不采用,毕竟更改服务器配置就会对其他web应用产生影响。而解决方法就只有手工解决。
//request.setCharacterEncoding("UTF-8");//此方法只对post有用,对get无用  
String username=request.getParameter("username");
String name=new String(username.getBytes("ISO8859-1"),"UTF-8");
System.out.println(username);
System.out.println(name);

三、请求转发。
此方法在web开发中MVC设计模式经常用到,此时由servlet只处理数据,而jsp只显示数据,所以servlet处理完数据后,调用request的setAttribute方法,将数据存入request域中,在调用RequestDispatcher getRequestDispatcher(String path)方法,此方法返回一个RequestDispatcher对象,在调用forward方法,就可以将请求转发到jsp,在jsp里取出数据显示。
重定向地址栏有变化,客户机总共发送了两次请求,而请求转发地址栏不会有变化,客户机也只发送了一次请求。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String data="xxx";

//request数据传递,请求转发
request.setAttribute("data", data);
request.getRequestDispatcher("/index.jsp").forward(request, response);

}

另外还有一些细节需要注意:(1)如果在调用forward方法之前,servlet写入部分已经被真正的传给客户端,那么将抛出IllegelStateException异常。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data="xxx";
request.setAttribute("data", data);

PrintWriter writer=response.getWriter();
writer.write(data);
writer.close();
//以下跳转会抛出无效异常
request.getRequestDispatcher("/3.jsp").forward(request, response);
}
(2)如果在调用forward方法之前向servlet的response中写入数据,那么只要数据没有真正的传给客户端,那么forward方法可以被正常执行,而response写入的数据会被清空,但response中的响应头字段信息保持有效。

四、refere防盗链。
如果网站辛苦找到的资源,轻松就被他人通过地址访问,那网站的辛苦不是仅仅就是别人网站的一个超链接。所以可以通过refere得到来访地址,如果不是通过本站跳过来的,就返回本站首页。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String refere=request.getHeader("refere");
if(refere==null||refere.startsWith("/http:localhost")){
response.sendRedirect("/Test/index.jsp");
return;
}
String data="xxx";
response.getWriter().print(data);
}
版权声明:本文为u014768446原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014768446/article/details/84486107

智能推荐

对Request-ID的一些认识

为什么要使用Request Id Request Id 是为了解决下面问题 Request Id Vs 没有Request Id 没有Request Id 请求,只能根据调用函数日志关键,在根据用户的输入的参数,时间来确定相关的日志。 如果项目是以分布式,微服务架构来实现, 上面查日志方式帮助很小。原因如下 requestId 当前项目,根据request id 可以找到所有与请求相关的日志 不同...

Rails的一些笔记(一)

1. 增删改查: User.create() User.find_by_id() User.find_by_id().destroy User.find_by_id().name = “hello” 2. Rails 提供的 csrf_meta_tags 方法,作用是避免跨站请求伪造(Cross-Site Request Forgery,简称 CSRF,一种恶意网络攻击) ...

django学习笔记---CBV和FBV模式以及一些url写法(request,name)的应用场景

url.py view.py index.html cbv.html 如果在浏览器输入http://127.0.0.1:7000/cbv/ ,那么pycharm会输出 总结: 上面的路由系统对应关系伪代码见下,a-e上面以写 reverse('m1:indexx',kwargs={'nid':1}) 输出 /admin/indexreverse('m2:indexx',kwargs={'nid':...

一些笔记

修饰大结构体的修饰词可以用public和internal(当前程序集可以用) proticted受保护的,不能再结构体中使用,只能在类中使用,因为结构体是不能继承的 float类型的浮点数需要加f...

一些笔记

一、关于svg与vewport 参考文章:SVG系列教程:坐标系统 http://www.w3cplus.com/html5/... 1、对于桌面浏览器,Viewport其实就是浏览器的宽度高度,在移动端会先对复杂一点。 2016/10/10 1、关于css中body和html的常用设置 html设置 body设置 2、inline-block 对内block,对外inline。 text-ali...

猜你喜欢

一些笔记

APUE 学习笔记 2019-6-12 实验楼版本 第1章 UNIX基础知识 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境,通常将这种软件称为内核(kernel)。内核的接口被称为系统调用(system call),公用函数库构建在系统调用接口之上,应用程序即可使用公用函数库也可使用系统调用。 当创建一个新目录时,自动创建了两个文件名:.(称为点)和..(称为...

一些笔记

一些笔记 1.并发和并行:所有程序在经由一个cpu处理时,cpu经过操作系统调度,将一段时间分割成若干份,分别去执行需要执行的程序就是并发;多个处理器分别处理多个程序叫做并行。 2.关于元类 a.我们使用class关键字定义类的时候,method的第一个参数一般总是self,它指向调用method的对象(类实例)本身。 b.实际上,当我们使用class关键字定义好一个类,python解释器就是通过...

ThreadLocal的一些笔记

ThreadLocal最常用的场景:一个对象并非是线程安全的,但是你想让每个线程中访问的该对象是唯一的,不会和其他线程冲突,那么你就要用到ThreadLocal了。 举个简单的例子,比如SimpleDateFormat对象,不是线程安全的,假设该对象在多线程访问下会出问题,发生冲突,那么应该让每个线程只获取到唯一的该对象的实例,而且彼此线程不能访问对方的该实例。 用这个简单的例子去看struts2...

Tomcat 的一些笔记

设置Xms, Xmx for tomcat的大小: 一般来说, heap size的大小制定为物理内存的80%左右.   虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过 分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很 快,但是会更加频繁。调...