Servlet是由SUN公司提供的一门动态Web资源开发技术
1.静态Web资源:不一样的人,在不一样的条件下访问后看到的是相同的效果,这样的资源叫作静态Web资源(html、css、js等);
2.动态Web资源:在不一样的访问条件下看到的是不一样的效果,这样的资源叫作动态Web资源css
(Servlet、jsp、.NET、PHP等)。 Servlet本质上是一段Java程序,和以前的Java程序不一样的是,Servlet程序没法独立运行,须要将Servlet程序放在服务器中(好比tomcat服务器),由服务器调用才能够执行。
Servlet: 服务器端的Java程序.html
Servlet是运行在服务器端的Java程序,其做用是什么?web
其做用是对服务器接收过来的请求进行处理(做用为处理请求)
image数组
request是表明HTTP请求信息的对象,response是表明HTTP响应信息的对象。浏览器
当浏览器发请求访问服务器中的某一个Servlet时,服务器将会调用Servlet中的service方法来处理请求。在调用service方法以前会建立出request和response对象。tomcat
其中request对象中封装了浏览器发送给服务器的请求信息(请求行、请求头、请求实体等),response对象中将会封装服务器要发送给浏览器的响应信息(状态行、响应头、响应实体),在service方法执行完后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器。服务器
问题1:什么是请求参数?
所谓的请求参数,就是浏览器发送给服务器的数据(不区分请求方式),例如:经过表单向服务器提交的用户名、密码等,或者在超连接后面经过问号提交的数据,都是请求参数。
实例:
http://localhost/day10/TestPa...
问题2:如何获取请求参数?
(1)request.getParameter(String paramName)
//-- 根据请求参数的名字获取对应的参数值,返回值是一个字符串;
//-- 若是一个参数有多个值,该方法只会返回第一个值。
//-- 若是获取的是一个不存在的参数,返回值为null
(2)request.getParameterValues(String paramName)
//-- 根据请求参数的名字获取该名字对应的全部参数值组成的数组,返回值是一个字符串数组,其中包含了这个参数名对应的全部参数值
//-- 若是获取的是一个不存在的参数,返回值为null
举例:
//1.获取请求参数中的用户名(user)
String user = request.getParameter("user");
System.out.println( "user="+user );jsp
//2.获取请求参数中的爱好(like)
String[] like = request.getParameterValues( "like" );
System.out.println( "like="+Arrays.toString( like ) );
3.获取请求参数时出现中文乱码问题
在获取中文的请求参数时,可能会出现乱码问题(和请求方式、tomcat服务器版本有关),具体能够分为如下三种状况:
(1)若是请求是GET提交,而且tomcat是8.0及之后的版本,GET提交的中文参数,在获取时不会出现乱码问题!(8.0之后的to mcat包括8.0在获取GET提交的中文参数时,已经处理中文乱码问题。)编码
(2)若是请求是POST提交,不论是哪一个版本的tomcat服务器,在获取中文参数时,都会出现乱码问题。由于tomcat底层在接收POST提交的参数时,默认会使用iso8859-1编码接收,而这个编码中没有中文字符,因此在接收中文参数时,必定会出现中文乱码问题!
解决方法是:通知服务器在接收POST提交的参数时,使用utf-8编码来接收!
代码实现:
request.setCharacterEncoding("utf-8");
注意:这行代码不会影响GET提交,只对POST提交有效!url
这行代码要放在任何获取参数的代码以前执行!
(3)若是请求是GET提交,而且tomcat是7.0及之前的版本,GET提交的中文参数,在获取时会出现乱码问题!
解决方法:在[tomcat安装目录]/ conf/server.xml文件的(修改端口的)Connector标签上,添加一个 URIEncoding="utf-8" 属性,以下:
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" />
同时在[Eclipse]/Servers/[当前tomcat服务器对应的配置目录]/server.xml文件中,在Connector标签上,添加一个 URIEncoding="utf-8" 属性,同上!
response是表明HTTP响应信息的对象。
PrintWriter out = response.getWriter();
因为服务器在经过response获取的流发送数据时,默认使用iso8859-1编码,而这个编码中没有中文字符,因此在经过response获取的流发送中文数据时,会出现乱码问题。
解决方法是:在响应数据以前,通知服务器使用utf-8发送数据。
/* 通知服务器在响应数据时,使用utf-8编码
response.setContentType( "text/html;charset=utf-8" );
PrintWriter out = response.getWriter();
out.write( "你好" );
请求转发是服务器内部资源的一种跳转方式,即当浏览器发送请求访问服务器中的某一个资源(A)时,该资源将请求转交给另一个资源(B)进行处理而且由资源B作出响应的过程,就叫作请求转发。
请求转发和重定向都是资源的跳转方式,可是跳转的过程有所不一样。
请求转发的特色:
(1)转发是一次请求,一次响应
(2)请求转发先后,浏览器的地址栏地址不会发生变化。(浏览器--访问--> A --转发--> B,地址栏地址始终指向A的地址)
(3)请求转发先后的两个资源必须属于同一个Web应用,不然将没法进行转发。(A--转发-->B,A和B必须属于同一个Web应用!)
(4)在转发时,能够带数据到目的地(好比,从A转发到B,能够从A带数据给B,须要配合域对象才能够)
请求转发实现的代码:
request.getRequestDispatcher(url地址/转发到资源的地址).forward(req, res);
当浏览器向服务器发请求访问某一个资源A,资源A在响应时通知浏览器须要向B进一步发出请求才能获取到对应的资源,浏览器再次发请求访问服务器中的资源B,最终由资源B响应浏览器要获取的资源,这个过程叫作重定向。
重定向的特色:
(1)重定向是两次请求、两次响应
(2)重定向先后,浏览器的地址栏地址会发生变化。(由于两次请求都是经过浏览器发起,浏览器知道这个跳转的过程,所以地址栏地址会变化)
(3)重定向先后的request对象不是同一个(由于重定向是两次请求,服务器会根据两次请求建立两个不一样的request对象,request对象不是同一个,也就不能在重定向时经过request带数据到目的地。)
(4)重定向先后的两个资源能够是来自不一样的web应用,甚至能够是来自不一样的服务器。(进行跳转的两个资源之间没有限制)
总结1.请求转发(forward)和重定向(redirect)的区别?
(1)请求转发是一次请求,一次响应; 而重定向是两次请求两次响应
(2)请求转发先后地址栏地址不会发生变化; 而重定向先后地址栏地址会发生变化
(3)请求转发先后的request对象是同一个,能够配合request域对象带数据到目的地; 而重定向先后的request对象不是同一个, 不能结合request域对象在重定向先后带数据.
(4)请求转发要求两个资源必须属于同一个Web应用; 而进行重定向的两个资源能够是同一个Web应用,也能够不是同一个Web应用,甚至能够是来自于不一样的主机或服务器.
总结-2:何时用请求转发(forward)?何时用重定向(redirect)?(1)若是但愿跳转先后地址栏地址不会发生变化, 只能使用转发; 若是但愿跳转先后地址栏地址会发生变化, 只能使用重定向(2)若是但愿在跳转先后, 可以经过request对象带数据到目的地, 只能使用转发(3)若是仅仅是作一个跳转,没有其余要求,此时推荐使用转发(转发是一次请求,一次响应,能够减小访问服务器的次数,下降服务器的压力)