綠 青 色

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

posted @ 2021-07-30 11:59  LYANG-A  阅读(60)  评论(0编辑  收藏  举报