zoukankan      html  css  js  c++  java
  • 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,则不会扫描标注。

  • 相关阅读:
    gdb 调试器的使用
    vi 的基本操作
    Makefile
    gcc
    动态内存分配
    Linux常用命令
    文件基本操作
    linux的启动配置文件(grub)
    Hello IT
    Val简介(来源维基百科)
  • 原文地址:https://www.cnblogs.com/changzuidaerguai/p/9632504.html
Copyright © 2011-2022 走看看