Servlet

Posted liang-shi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet相关的知识,希望对你有一定的参考价值。

一、什么是Servlet
1、什么是Servlet
	Servlet 是由SUN公司提供的一门动态Web资源开发技术
	静态Web资源: 不同的人去访问看到的效果都是相同的
		html/css/js等
	动态Web资源: 在不同的条件下看到的是不同的效果
		Servlet/JSP/.NET/php等

	Servlet是本质上是一个Java程序,但和我们之前接触的Java程序不同的是,
	Servlet无法独立运行(Servlet中没有main函数)
	需要将Servlet程序放在服务器中,由服务器调用才可以执行!

	运行在服务器中的Servlet程序作用是: 对服务器接收的请求进行处理(处理请求)

2、整合tomcat和Eclipse
	参考:《第二阶段讲义02.unit04-xx.1.9.tomcat整合eclipse》
	视频链接:https://www.bilibili.com/video/BV1wz411z73V

3、在Eclipse中创建Web项目
	参考讲义
	
二、开发Servlet程序
1、开发Servlet程序的步骤
	1)写一个类,需要实现一个Servlet接口或者继承Servlet接口的子类
		Servlet
		  |-- GenericServlet 实现了Servlet接口,并实现了其中的方法
		  			|-- HttpServlet 继承了GenericServlet,也实现了其中的方法
		在开发时,我们只需要继承HttpServlet,并继承其中的方法即可!

	2)在web.xml文件中配置Servlet对外访问的路径,再将Web应用发布到服务器中运行即可!
	
2、如何通过Eclipse创建一个Web应用
	具体步骤参考讲义!
	注意事项:
	1)Dynamic Web Version:选择2.5版本,因为2.5版本之后是通过注解配置Servlet,
		注解配置Servlet是变简单了,但是不好理解,因此我们选择2.5版本,
		使用xml配置Servlet(xml配置Servlet的信息不用我们手写,会自动生成!)	
	
	2)Web项目推荐使用 Package Explorer 打开, 不要使用 Project Explorer!!

	3)Web项目在Eclipse中的目录结构
		CGB-Servlet-01(We项目)
			|-- src: 其中用于存放java源文件(xx.java),也可以放配置文件(xml/properties)
			|-- build/classes: src源码目录中的东西经过编译后,会输出到classes目录下
			|-- WebContent: 是Web应用的根目录,其中可以存放静态Web资源文件(html/css/js等)、编译后的class文件、Web应用所依赖的jar包、web.xml文件等
					|-- WEB-INF
						  |-- lib: Web应用所依赖的jar包
						  |-- web.xml: web应用的核心配置文件(配置Servlet等)
2、如何通过Eclipse创建一个Servlet程序?
	具体步骤参考讲义!

	/* 当浏览器发请求访问HelloWorld这个Servlet时,服务器就会调用这个Servlet
     * 如果请求方式为GET提交,就会调用doGet方法来处理请求。
     */
	protected void doGet(HttpServletRequest request, HttpServletResponse response){
		//暂时不写中文(因为中文会乱码)
		response.getWriter().write("Hello World..."+ new Date());
	}
	
	/*
	 * 如果请求方式为POST提交,就会调用doPost方法来处理请求。
	 * 当POST提交和GET提交处理方式一样时,可以在doPost方法中直接调用doGet,
	 * 		在doGet中处理请求即可
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response){
		doGet(request, response);
	}
	
3、运行Servlet程序
	第01种运行方式:
	1)自己手动将项目发布到服务器
		在tomcat服务器上右键,选择“add and remove”,
		在左侧双击项目,将项目发布到服务器中,点击完成即可!
	2)在tomcat服务器上右键,选择”start”、“Restart”,启动服务器
	3)打开浏览器输入地址进行访问!
		http://localhost:8080/CGB-Servlet-01/HelloWorld

		Class clz = Class.forName("com.tedu.HelloWorld");
		HelloWorld hw = (HelloWorld)clz.newInstance();
		hw.xx()
		hw.doGet();
		
	第02种运行方式: 
		直接在要运行的文件(html/jsp/servlet等)上-->右键-->Run as-->Run On Server,
	eclipse会帮我们做如下几件事儿:
	1)将Servlet所在的Web项目发布到服务器中
	2)再启动tomcat服务器
	3)最后打开浏览器,在地址栏输入路径去访问这个Servlet
	Eclipse默认用内置浏览器去访问Servlet,但是这个内置浏览器有bug,最好是使用本地的浏览器去测试!

		
	
4、Servlet在web.xml文件中的配置
	全限定类名(全类名): 包名.类名 或者 包名.接口名
	----------------------------------------------------------
	<servlet>
		<!--  1.这里的servlet-name要和下方的servlet-name内容保持一致 -->
		<servlet-name>HelloWorld</servlet-name>
		<!--  2.按住ctrl键,鼠标移到包名+类名上,有下划线说明路径是对的
			服务器会通过 反射+全限定名称 创建该类的实例,再调用其中的方法  -->
		<servlet-class>com.tedu.HelloWorld</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>HelloWorld</servlet-name>
		<!-- 这里怎么配置,就用什么路径访问Servlet -->
		<url-pattern>/HelloWorld</url-pattern>
	</servlet-mapping>
	----------------------------------------------------------
	1)每创建一个Servlet,eclipse会帮我们生成至少8行配置信息
		这8行配置信息由一个Servlet标签和一个servlet-mapping标签组成
		这两个标签中的<servlet-name>标签中的内容一致,决定了它俩是一组配置
	2)<servlet-class>标签中配置的是当前Servlet类的全类名(包名.类名)
		将来服务器根据访问路径找到这个全类名,再利用反射+全类名可以获取当前Servlet类的实例	
	3)<url-pattern>标签中配置了外界该通过什么路径来访问当前Servlet。
		也就是说,这里配置什么路径,外界就得通过什么路径来访问这个Servlet!

	注意事项1: Servlet在Web.xml文件中的配置信息是在创建Servlet时,Eclipse帮我们生成的
		如果Servlet不是通过Eclipse创建(比如是复制过来的),Eclipse不会生成Servlet
		配置信息, Servlet没有配置信息是无法访问的(使用注解开发除外)!
	
	注意事项2: 如果不知道什么原因,tomcat服务器启动失败了,可以将Eclipse创建的Server删除,
		再重新创建一份(删除Server同时,也将左侧的Servers项目从工作空间中删除!)

	注意事项3: 在将tomcat和Eclipse整合之后,tomcat默认开启了热部署功能:
		在修改了代码后,不用重新发布,也不需要重启服务器,就可以运行最新的效果!
		(如果是创建了新的Servlet类,或者修改了web.xml文件,则需要重启服务器,才会生效!)
				
5、Servlet调用过程
	将创建好的Servlet发布到服务器中运行,通过浏览器访问这个Servlet。
	那么这个Servlet是如何被调用?又是如何执行的?
	参考《Servlet调用过程图》
	-------------------------------------------
	GET /CGB-Servlet-01/HelloWorld HTTP/1.1
	Host: localhost:8080
	User-Agent: Mozilla/5.0 ...
	...
	-------------------------------------------
	Eclipse将Web项目发布到了哪个位置?
	工作空间:在eclipse中的某一个项目上,右键选择“Show In”--> “System Explorer”,就可以打开工作空间目录
	在[工作空间目录]/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/

6、Eclipse是怎么将一个Web项目发布到服务器中的?
	参考讲义!

7、创建Servlet 3.0及之后版本的web项目
	创建Servlet3.0及之后版本的Web项目,不会生成web.xml文件,那如何配置Servlet类的全类名和访问路径
		<servlet-class>com.tedu.HelloWorld</servlet-class>
		<url-pattern>/HelloWorld</url-pattern>
	------------------------------------------------------
	@WebServlet("/HiServlet")
	public class HiServlet extends HttpServlet {
		...
	}
	
	在Servlet3.0版本的项目中,tomcat服务器会扫描所有的Servlet类,如果类上面有@WebServlet主机,就会创建该类的实例
	另外,在 @WebServlet("/HiServlet") 注解内部配置的“/HiServlet”就是url-pattern中配置的访问路径,这个注解内部配什么,我们就通过什么来访问这个servlet。

8、添加Servlet模板
	具体步骤参考讲义!
	response.setContentType("text/html;charset=utf-8");
	通知服务器在向浏览器发送数据时使用utf-8编码;
	并通知浏览器在接收服务器发送过来的数据时,也是用utf-8进行接收
	这行代码就可以解决服务器在响应数据时,所出现的中文乱码问题!

Request总结 ----------------------------------- 一、Request和Response介绍 当浏览器向服务器发请求,服务器在调用Servlet的service方法处理请求之前,会创建代表请求的Request对象,和代表响应的Response对象。 将这两个对象传递给service方法,在service方法处理请求的过程中,如果要获取请求信息,可以通过request提供的方法进行获取;如果要向浏览器响应数据,可以将数据先写入到response缓冲区,等service方法执行结束,服务器会自动到response对象中获取到要发送给浏览器的数据,按照Http协议的格式将数据发送给浏览器。 二、Request常用功能 1、获取请求参数 1.1.什么是请求参数? 所谓的请求参数就是浏览器在发送请求时,带给服务器的数据。 例如:在地址栏URL地址的后面可以通过问号拼接参数,将数据带给服务器 http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu 也可以通过表单,将数据写入表单项中,通过提交表单将数据带给服务器 无论通过哪种方式带参数给服务器,参数都可以有多个,多个参数之间用&分隔,每一个参数都包含参数名和参数值 1.2.如何获取请求参数? http://www.baidu.com?user=zhangsan&psw=123&like=lanqiu&like=zuqiu 1)request.getParameter(String paramName) -- 返回String字符串 -- 通过请求参数的名字,获取对应的参数值。比如传入"user",返回"zhangsan" -- 如果获取的参数有多个值,该方法只会返回第一个值,比如传入"like",只返回一个"lanqiu" -- 如果获取的参数是不存在的,该方法会返回null,比如传入"uesr",此时会返回null值 2)request.getParameterValues(String paramName) -- 返回String[]数组 -- 通过请求参数的名字,获取对应的所有参数值组成的数组。比如传入"like",返回 {"lanqiu", "zuqiu"} -- 如果获取的参数值只有一个,该方法仍然返回一个数组,比如传入"user",返回 {"zhangsan"} -- 如果获取的参数是不存在的,该方法会返回null,比如传入"uesr",此时会返回null值 开发实例:实现一个注册功能 1)浏览器访问服务器中的注册页面(regist.html),用户在注册页面中填写注册信息 2)提交表单,将填写的注册信息提交给服务器中的RegistServlet 3)在RegistServlet中获取用户提交过来的注册数据(用户名、密码、性别、爱好、城市、自我描述) 4)将注册数据保存到数据库中(mysql、JDBC) 1.3.如何处理在获取请求参数时出现的中文乱码问题? GET提交参数是通过URL地址后面拼接参数,将参数提交给服务器 POST提交参数是通过请求实体将参数提交给服务器 服务器在接收GET提交的参数时,默认使用UTF-8来进行接收(浏览器提交参数用的也是utf-8),因此获取GET提交的参数没有问题。 但服务器在接收POST提交的参数时,默认使用iso8859-1来进行接收,而这个编码中没有中文字符,因此在接收中文数据时,会出现乱码问题。 解决方法是:通知服务器接收POST提交的参数时,也通过utf-8来进行接收 request.setCharacterEncoding("utf-8"); 注意:这行代码要放在获取参数的代码之前执行! 这行代码只对POST提交生效,GET比较不受任何影响! 2、实现请求转发 转发(forward)和重定向(redirect)都服务器中的一种跳转方式 所谓的请求转发是服务器内部资源之间的跳转方式(从一个资源跳转到另外一个资源) 请求转发(forward)的特点: 1)转发是一次请求一次响应 2)转发前后地址栏地址不会发生变化 3)转发只能在同一个Web应用内部两个资源之间进行跳转 4)在转发的两个资源之间可以利用request域(map)传递数据 请求转发的实现代码: request.getRequestDispatcher("资源路径").forward(request,response); 3、作为域对象使用(需要配合转发) 在请求转发时,会将request对象传递给所转发的资源(A--转发-->B,会将A中的request传递给B) 可以在转发之前,往request的map中存入数据,再转发,由于转发时会将request带到所转发的资源 在转发的资源中,可以通过request将map中携带的数据再取出来! 在ServletA中,往request的map中存入数据: request.setAttribute(String name, Object value); //将请求转发到ServletB request.getRequestDispatcher("ServletB的路径").forward(req,res); 在ServletB中,可以通过request将map中的数据取出来: request.getAttribute(String name); Response总结 ----------------------------------- 1、实现请求重定向 请求重定向(Redirect)的特点: 1)重定向是两次请求两次响应 2)重定向前后地址栏地址会发生变化 3)进行重定向的两个资源没有限制,可以是同一个Web应用,也可以是不同的Web应用甚至可以是不同的服务器 4)在重定向的过程中不可以通过request的map集合带数据到目的地 实习请求重定向: response.sendRedirect("所重定向到资源的地址");

以上是关于Servlet的主要内容,如果未能解决你的问题,请参考以下文章

ServletServlet 详解(使用+原理)

ServletServlet容器等内容讲解

web.xml servletservlet-mapping配置

ServletServlet学习之基础篇

ServletServlet学习之基础篇

ServletServlet学习之基础篇