Servlet概述

RUL、URN、URI
URL格式:<协议>:<特定协议部分>
协议指定了以何种方式取得资源:

  • ftp(文件传输协议)
  • http(超文本传输协议)
  • mailto(电子邮件)
  • file(特定主机文件名)

协议之后跟冒号,特定协议部分的格式为:

<用户>:<密码>@<主机>:<端口号>/<路径>

URL代表资源的地址信息,URN代表某个资源独一无二的名称,URI是URL和URN的子集。
GET请求和POST请求

  1. GET请求跟随在URL之后的请求参数长度有限,过长的请求参数,或如文件上传这类大量数据,不适合GET请求,应该改用POST请求
  2. GET请求参数会出现在地址栏上,敏感性或有安全考虑的请求参数不应该使用GET请求
  3. POST请求参数不会出现在地址栏上,所以无法加入浏览器的书签中
  4. 有些浏览器会依网址缓存数据,如果网址是相同的URL,则会直接从浏览器缓存中取出数据,而不会真正发送请求到服务器上查询最新的结果。如果不希望服务器状态改变了,而浏览器仍从缓存中取得旧的资料,则使用POST请求(使用GET也可以避免缓存,比如在网址上附加时间戳,让每次GET请求网址不同)
  5. GET请求应该用于等幂操作。GET请求纯粹取得资源,而不改变服务器上的数据或状态。
  6. POST请求应用于非等幂操作。POST请求发送的数据可能会影响到服务器上的数据或状态

请求/响应的基本例子

  1. 客户端对Web服务器发出HTTP请求
  2. HTTP服务器收到HTTP请求,将请求转由Web容器处理,Web容器会剖析HTTP请求内容,创建各种对象(HttpServletRequest、HttpServletResponse、HttpSession等)
  3. Web容器由请求的URL决定要使用哪个Servlet来处理请求
  4. Servlet根据请求对象的信息决定如何处理,通过响应对象来创建响应
  5. Web容器与HTTP服务器沟通,Web服务器将响应转换为HTTP响应并传回客户端

Web容器可能会使用同一个Servlet实例来服务多个请求,也就是多个请求下,多个线程在共享存储一个对象。因此需要注意线程安全问题,避免引发数据错乱。
MVC
M Model 模型 模型不会有画面相关的程序代码:接受控制器的请求调用,负责处理业务逻辑,负责数据存取逻辑等
V view 视图 视图负责画面相关逻辑:接受控制器的请求调用,会从木星提取运算后的结果,根据需求呈现所需的画面
C Controller 控制器 控制器知道某个操作必须调用哪些模型:取得请求参数、验证请求参数、转发请求参数、转发请求给画面
Ecplise添加Web服务器

Window/Preferences/Server Runtime Environments中Add

预设文字编码

Window/Preferences/General/workspace中Text File encoding
再展开Web节点,选择CSS Files中Encoding选择UTF-8
			   选择HTML File中Encoding选择UTF-8

创建第一个Servlet程序

  1. 选择File | New | Dynamic Web Project命令
  2. 确定Target runtime设置为tomcat 7.0
  3. 展开Java Resources节点,在src上右击,从弹出的快捷菜单中New | Servlet命令
  4. 在弹出的create servlet对象框中在Java package文本框输入First.firstservletpackage(servlet类所在路径),在class name文本框中输入HelloServlet,单机next
  5. 选择URL mapping中的HelloServlet,单机右边的Edit按钮,将pattern改为/hello.view(访问路径),单击确认
  6. Finish
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设定响应字符集
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		//获得指定名称的请求参数
		String name = request.getParameter("name");
		//响应输出html
		out.println("<html>");
		out.println("<head>");
		out.println("<title>hello servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1> hello!" + name + "! </h1>");
		out.println("</body>");
		out.println("</html>");
		out.close();
	}

选择Run On Server会自动跳到Ecplise内置浏览器,在网址尾接:?name=lilei,就会输出这个值
Servlet接口
Servlet接口定义了servlet的基本行为,与生命周期相关的init(),destory()方法,提供服务时所要调用的service()方法等。
实现Servlet接口的类是GenericeServlet类,它还实现了ServletConfig接口,将容器调用init()方法时所传入
HTTP相关服务流程定义在HttpServlet的service()方法中

与Servlet相关的都位于javax.servlet包中,比如Servlet、GenericServlet等
与HTTP相关的位于javax.servlet.http包中,比如HttpServlet、HttpServletRequest等

HttpServlet的service()方法流程大致如下:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws Exception{
	String method = req.getMethod(); //取得请求方法
	if(method.equals(METHOD_GET)){
		//...
		doGet(req, resp);
		//...
	}else if(method.equals(METHOD_HEAD)){
		//...
		doHead(req, resp);
		//...
	}else if(method.equals(METHOD_POST)){
		//...
		DOpOST(req, resp);
		//...
	}else if(method.equals(METHOD_PUT)){
		//...
	}
}

当请求到来时,容器调用Servlet的Service()方法,判断HTTP的请求方式,再分别调用doGet(),doPost()等方法。
@WebServlet

@WebServlet(
			asyncSupported	//boolean 指定Servlet是否支持异步操作模式
			name="Three",		//String 这个Servlet的名称是Three
								//可以指定,也可以不指定,指定了可以通过getServletName()方法获得,没有指定则是Servlet的完整类名
			urlPatterns = {"/ThreeServlet"},  //客户端请求的URL是/ThreeServlet
											 //可以配置多个映射,配置了多个映射代表不同的地址信息指向同一个文件
			displayName = "thrid",			//指定Servlet显示名称
			initParams = {					//配置初始化数据
					@WebInitParam(name = "name", value = "Three")
			},
			loadOnStartup = 1)	//标记容器是否在应用启动时就加载这个Servlet
								//0或正数表示启动应用就加载,数字越小,加载Servlet的优先级就越高

使用注解需要注意:
根元素不能配置属性metadata-complete="true",否则无法加载Servlet。metadata-complete属性表示通知Web是否寻找注解,默认不写或设置false,容器会扫描注解和web分片,为Web应用程序构建有效元数据;设置为true,表示部署描述符为Web程序提供所有的配置信息。
web.xml中不能再配置Servlet。
web.xml

<web-app>
	<servlet>
		<servlet-name><servlet-name>
		<servlet-class><servlet-class>
		<load-on-startup></load-on-startup>
	</servlet>
	<servlet-mapping>	
		<servlet-name></servlet-name>
		<url-pattern></url-pattern>
	</servlet-mapping>
<web-app>

web.xml标签详解

 1.<web-app></web-app>
  <web-app></web-app>是部署描述的根元素,该元素含23个子元素。在Servlet2.3中,子元素必须按照DTD文件描述中指定的顺序出现。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>两个子元素,则<servlet>子元素必须出现在<servlet-mapping>子元素之前。在Servlet2.4中,顺序并不重要。

 2.<display-name></display-name> 
  <display-name></display-name>定义web应用的名称。如<display-name>trk-order-rest</display-name>

 3.<distributable/>
  <distributable/>可以使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。

 4.<context-param></context-param>
	<context-param>元素含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在web应用的整个生命周期中上下文初始化参数都存在,任意的Servlet和jsp都可以随时随地访问它。<param-name>子元素包含有参数名,而<param-value>子元素包含的是参数值。作为选择,可用<description>子元素来描述参数。

 5.<session-config></session-config>
	设置容器的session参数,<session-timeout>指定session的失效时间(默认30分钟),<session-timeout>值必须为整数,为0或负数,表示会话永远不会超时

  6.<filter></filter>
	预处理

  7.<listener></listener>
	监听器

web-fragment.xml
使用标注设置servlet的信息,定义标注完之后,封装在jar文件中,需要放在lib文件夹中。如果web.xml中设置为true,则不会扫描标注。

原文地址:https://www.cnblogs.com/changzuidaerguai/p/9632504.html