zoukankan      html  css  js  c++  java
  • Servlet

    什么是Servlet

      Servlet: Server applet : 服务端的小程序.Servlet就是服务端一个用于接收客户端的请求和向客户端做出响应的程序.

      Servlet 是运行在 Web 服务器或应用服务器上的 java 程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,您可以收集来自网页表单的用户数据,呈现来自数据库或者其他源的记录,还可以动态创建网页。

      在实际工作中,Servlet的概念,分为狭义和广义的.

      狭义的说Servlet是一个小程序.
      广义的说servlet其实是一个Java类,是一个实现了Servlet接口的类.

    Servlet的作用

    Servlet 执行以下主要任务:

      1、读取客户端信息(传递的信息,请求头信息)(获取客户端数据)
      2、处理信息。(处理数据)
      3、响应数据。(返回数据: 业务数据,响应头信息)

    如何实现Servlet:

    Servlet: Java类,是一个实现了Servlet的类.

    1. 创建一个类

    2. 实现Servlet接口

      package com.sxt.controller;
      
      import java.io.IOException;
      
      import javax.servlet.ServletException;
      import javax.servlet.ServletRequest;
      import javax.servlet.ServletResponse;
      import javax.servlet.http.HttpServlet;
      
      public class ServletDemo01 extends HttpServlet  {
      
      	private static final long serialVersionUID = -2597540888550505998L;
      	
      	@Override
      	public void init() throws ServletException {
      		System.out.println("====init====");
      	}
      
      
      	@Override
      	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
      		System.out.println("====service====");
      		// 读取谁的?
      	}
      
      	@Override
      	public void destroy() {
      		System.out.println("====destroy====");
      	}
      
      }
      
    3. 注册Servlet

    4. 配置Servlet 提供访问方式

        <!-- 注册Servlet -->
        <servlet>
        	<!-- servlet别名 -->
        	<servlet-name>ergou</servlet-name>
        	<!-- Servlet类的全路径 -->
        	<servlet-class>com.sxt.controller.ServletDemo01</servlet-class>
        </servlet>
        
        <!-- 配置Servlet 提供访问方式 -->
        <servlet-mapping>
        	<!-- servlet别名 -->
        	<servlet-name>ergou</servlet-name>
        	<!-- servlet的访问地址  -->
        	<url-pattern>/ergou.html</url-pattern>
        </servlet-mapping>
      

    Servlet生命周期

      在Servlet中,Servlet是单例模式的.每个Servlet类,有且只有一个对象.

      init()方法:默认会在第一次访问时执行,且只执行一次,一般用于初始化Servlet信息.

      detory()方法:默认会在服务器停止时执行,且只执行一次,用于销毁Servlet对象.

      service()方法:默认会在每次有访问请求时执行,每次请求都会执行.用于处理请求.

      init----> service ----> detory 这就是Servlet生命周期.

    注意:

      Servlet是单例的,所以Servlet是非线程安全的.一般在使用Servlet时,不建议定义成员变量.

    Servlet执行流程

    image

    Servlet的功能

    接收客户端信息:HttpServletRequest

    form表单信息

    package com.sxt.controller;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class RequestServlet extends HttpServlet {
    
    	private static final long serialVersionUID = 4858130557364545084L;
    	/**
    	 * 当是  get请求时  执行
    	 */
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("doGet");
    //		String userName = req.getParameter("userName");
    //		String password = req.getParameter("password");
    //		String selectName = req.getParameter("selectName");
    //		String[] likes = req.getParameterValues("like");
    //		String sex = req.getParameter("sex");
    //		String textName = req.getParameter("textName");
    //		
    //		System.out.println("userName: "+userName);
    //		System.out.println("password: "+password);
    //		System.out.println("selectName: "+selectName);
    //		System.out.println("likes: "+Arrays.toString(likes));
    //		System.out.println("sex: "+sex);
    //		System.out.println("textName: "+textName);	
    	}
    	
    	/**
    	 * 	当是 post请求时 执行
    	 */
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		req.setCharacterEncoding("UTF-8");
    		System.out.println("doPost");
    		String userName = req.getParameter("userName");
    		String password = req.getParameter("password");
    		String selectName = req.getParameter("selectName");
    		String[] likes = req.getParameterValues("like");
    		String sex = req.getParameter("sex");
    		String textName = req.getParameter("textName");
    		
    		System.out.println("userName: "+userName);
    		System.out.println("password: "+password);
    		System.out.println("selectName: "+selectName);
    		System.out.println("likes: "+Arrays.toString(likes));
    		System.out.println("sex: "+sex);
    		System.out.println("textName: "+textName);
    		
    		// 获取所有表单数据的  name值
    		Enumeration<String> parameterNames = req.getParameterNames();
    		//遍历所有的name值
    		while(parameterNames.hasMoreElements()) {
    			System.out.println("name值:"+parameterNames.nextElement());
    		}
    		System.out.println("==========================");
    		//将 所有的请求参数 封装成一个Map 集合
    		Map<String, String[]> parameterMap = req.getParameterMap();
    		//获取所有的key
    		Set<String> names = parameterMap.keySet();
    		for (String name : names) {
    			System.out.println(name +":"+Arrays.toString(parameterMap.get(name)));
    		}
    		Map<String, Object> paramMap = paramMap(parameterMap);
    		System.out.println("转化后的:"+paramMap);
    		
    		
    	}
    	
    	/**
    	 * 	将存储封装一个map
    	 * @return
    	 */
    	public Map<String,Object> paramMap(Map<String, String[]> parameterMap){
    		Map<String,Object> map = new HashMap<String, Object>();
    		//获取所有的key
    		Set<String> keys = parameterMap.keySet();
    		for (String key : keys) {
    			String[] values = parameterMap.get(key);
    			Object value = null;
    			if(values != null &&values.length == 1 && values[0] != "") {
    				value = values[0];
    			}else if(values != null && values.length > 1) {
    				List<String> data = new ArrayList<String>();
    				for (String v : values) {
    					data.add(v);
    				}
    				value = data;
    			}
    			map.put(key,value);
    		}
    		return map;
    	}
    
    }
    

    获取作用域信息

    package com.sxt.controller;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Enumeration;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class AttributeServlet extends HttpServlet {
    	
    	private static final long serialVersionUID = 4858130557364545084L;
    	/**
    	 * 	当是  get请求时  执行
    	 */
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("doGet");
    		//getAttribute(name值) : 根据name值从 request 作用域中 获取对应值
    		//getAttributeNames() : 获取作用域中,所有属性名称
    		//setAttribute(name,value) : 设置request作用域中的属性值
    		// 设置属性值
    		req.setAttribute("key1", "value1");
    		req.setAttribute("key2", "value2");
    		req.setAttribute("key3", "value3");
    		System.out.println(""+req.getAttribute("key1"));
    		
    		Enumeration<String> attributeNames = req.getAttributeNames();
    		while(attributeNames.hasMoreElements()) {
    			System.out.println(attributeNames.nextElement());
    		}
    	}
    	
    	/**
    	 * 	当是 post请求时 执行
    	 */
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	}
    	
    
    }
    
    

    获取其他作用域对象

    package com.sxt.controller;
    
    import java.io.IOException;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class ScopeServlet extends HttpServlet {
    	
    	private static final long serialVersionUID = 4858130557364545084L;
    	/**
    	 * 	当是  get请求时  执行
    	 */
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("doGet");
    		//获取其他作用域 
    		//获取session作用域
    		HttpSession session = req.getSession();
    		session.setAttribute("sessionKey", "sessionValue");
    		// 获取 application 作用域
    		ServletContext application = req.getServletContext();
    		application.setAttribute("applicationKey", "applicationValue");
    	}
    	
    	/**
    	 * 	当是 post请求时 执行
    	 */
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	}
    	
    
    }
    
    

    获取网络请求信息

    package com.sxt.controller;
    
    import java.io.IOException;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class HttpInfoServlet extends HttpServlet {
    	
    	private static final long serialVersionUID = 4858130557364545084L;
    	/**
    	 * 	当是  get请求时  执行
    	 */
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// 获取请求的方法  :  get   post
    		String method = req.getMethod();
    		System.out.println(method);
    		// 获取请求的资源路径   
    		String uri = req.getRequestURI();
    		System.out.println(uri);
    		// 获取请求URL地址  http://127.0.0.1:8080/sxt/servlet.do
    		String url = req.getRequestURL().toString();
    		System.out.println(url);
    		// 请求端口
    		int remotePort = req.getRemotePort(); //客户端端口
    		System.out.println(remotePort);
    		int localPort = req.getLocalPort(); //服务器本地端口
    		System.out.println(localPort);
    		String remoteHost = req.getRemoteHost(); //客户端IP
    		String localAddr = req.getLocalAddr(); // 服务器IP
    		System.out.println("remoteHost:"+remoteHost);
    		System.out.println("localAddr:"+localAddr);
    		//设置请求的编码
    		req.setCharacterEncoding("UTF-8");
    		//获取请求头信息 :  Map  :  key -- value
    		String language = req.getHeader("Accept-Language");
    		System.out.println(language);
    	}
    	
    	/**
    	 * 	当是 post请求时 执行
    	 */
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	}
    	
    
    }
    
    

    重定向和内部转发

    //resp.sendRedirect("地址");  重定向
    resp.sendRedirect("scope.jsp");
    // 内部转发  req.getRequestDispatcher("scope.jsp").forward(req, resp); 
    req.getRequestDispatcher("scope.jsp").forward(req, resp);
    

    获取文件信息

    req.getPart("name") : 根据name值,获取对应part数据
    

    向客户端响应数据:HttpServletResponse

    package com.sxt.controller;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ResponseServlet  extends HttpServlet{
    	private static final long serialVersionUID = -2958733507466419241L;
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// 获取打印流
    		//resp.getWriter();
    		// 获取输出流
    		resp.getOutputStream();
    		// 设置 cookie
    		resp.addCookie(new Cookie("name","value"));
    		//设置编码
    		resp.setCharacterEncoding("UTF-8");
    		//设置响应头信息
    		resp.addHeader("token", "xxxxx");	
    	}
    }
    

    MVC模型:

      MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的
    是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别
    用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

      模型-视图-控制器(MVC)是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,已被广泛使用。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式,并且受到越来越多的使用ColdFusion和PHP的开发者的欢迎。模型-视图-控制器模式是一个有用的工具箱,它有很多好处,但也有一些缺点。

      MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:

        Model(模型)表示应用程序核心(比如数据库记录列表)(数据模型)。
        View(视图)显示数据(数据库记录)。
        Controller(控制器)处理输入输出(写入数据库记录)。

      MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制 .

    Model: 是应用程序中用于处理应用程序数据逻辑的部分.

      数据逻辑部分:数据校验,数据的持久化相关处理.

    View(视图) :是应用程序中处理数据的部分.

       处理数据:显示数据,输入数据.(界面)

    Controller(控制器) :是应用程序中处理用户交互的部分.

      交互:交流互动.输入输出.用于接收客户发送的信息,向客户端做出响应.

    而在JavaWeb开发中,利用各种技术优点和缺点.一般使用:

      Servlet 充当控制层.

      JSP 充当视图层

      Model 相关Java代码.

    MVC模型三层关系

    image

    MVC模型的优点

      1. 降低了程序耦合性
      2. 提高了代码的复用性
      3. 提高了程序的可维护性
      4. 提高了程序的可读性
      5. 提高了扩展性
      6. 提高了开发效率

    但是,提高了程序结构的复杂性。

    随着开发的发展,从MVC模型演变:

      MVP:移动端
      MVVM:vue.js

  • 相关阅读:
    【NOIP】提高组2015 运输计划
    【BZOJ】1635: [Usaco2007 Jan]Tallest Cow 最高的牛
    【51nod】1766 树上的最远点对
    【BZOJ】2054: 疯狂的馒头
    【SRM20】数学场
    【Luogu】P3930 SAC E#1
    【Luogu】P3927 SAC E#1
    【Luogu】 P3928 SAC E#1
    【Codeforces】868C. Qualification Rounds
    【CodeForces】866D. Buy Low Sell High
  • 原文地址:https://www.cnblogs.com/lyang-a/p/15079018.html
Copyright © 2011-2022 走看看