Tomcat、Servlet

Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

  1. 下载安装与卸载
    官网下载:http://tomcat.apache.org/
    安装:解压压缩包即可
    • 注意:安装目录建议不要有中文和空格
      卸载:删除目录就行了

Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet 理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用 来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

创建项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建首页

在这里插入图片描述
在这里插入图片描述

端口冲突问题

在这里插入图片描述
这个错误说明端口被占用了,8080 / 8005
如果是tomcat启动了多次,导致端口被占用,需要把原来的tomcat关闭,再重新启动即可

注册和映射

<!-- servlet注册  说明有这么一个类, 这个类在哪里 , 叫什么等等 -->
  <servlet>
  <!-- servlet的名字  比如HelloServlet_01就可以这样写 -->
  <servlet-name>HelloServlet</servlet-name>
  <!-- 类全名(带包名)  推荐复制粘贴, 这样不会出错 -->
 <servlet-class>com.helloServlet_01</servlet-class>
  </servlet>
  
  <!-- servlet和url的映射 -->
  <servlet-mapping>
  <!-- 名字, 需要和注册时的名称一致 -->
  <servlet-name>HelloServlet</servlet-name>
  <!-- 当有下面的请求的时候, 会执行HelloServlet 注意: /是必须加的 -->
  <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
  <!-- 上面的注册和映射与 @WebServlet("/hello") 注解是一致的  只需要在括号里写上自己的请求就可以 -->
  <!-- 在类的上面写上@WebServlet("/hello")  这样的注解, 就需要再在web.xml中写注册和映射了 -->

servlet接口

public class helloServlet_01 implements Servlet {
	/*
	 * 
	 * 当我们开始请求的时候, 会先执行web.xml, 匹配路由(就是xml文件配置的那些映射), 匹配如果不成功会报404 匹配成功的时候,
	 * 会先执行init, 并且只执行一次, 让后会执行servlet方法, 每次请求都会执行 在关闭Tomcat服务的时候, destory才会执行,
	 * 并且与init一样, 只执行一次
	 * 
	 * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest,
	 * javax.servlet.ServletResponse)
	 */
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		System.out.println("逻辑操作");
		// 设置相应类型的编码
		arg1.setContentType("text/html;charset=utf-8");
		arg1.getWriter().write(
				"<a href='https://www.baidu.com/' target='_blank'>百度</a>");
	}

	@Override
	public void destroy() {

	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {

	}

}

HttpServlet类

public class hTTPServlet_02 extends HttpServlet {

	
	// 1 把request和response对象进行了类型转换
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		HttpServletRequest request;
		HttpServletResponse response;
		try {
			request = (HttpServletRequest)req;
			response = (HttpServletResponse)resp;
		} catch (ClassCastException e) {
			throw new ServletException("non-HTTP request or response");
		}
		
		service(request, response);
	}
}

requestAPI

public class requestAPI_04 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		/**
		 * 1. 获取请求行数据 
		 * 方法: 
		 * 1. 获取请求方式 :GET String getMethod() 
		 * 2. (*)获取虚拟目录:/day14 String getContextPath() 
		 * 3. 获取Servlet路径: /demo1 String getServletPath() 
		 * 4. 获取get方式请求参数:name=zhangsan String getQueryString() 
		 * 5. (*)获取请求URI:/day14/demo1 String getRequestURI() StringBuffer getRequestURL() 
		 * 6. 获取协议及版本:HTTP/1.1 String getProtocol()
		 * 7. 获取客户机的IP地址: String getRemoteAddr()
		 */
		// GET
		// /Servlet_01
		// /requestAPI_01
		// null
		// /Servlet_01/requestAPI_01
		// http://localhost:8080/Servlet_01/requestAPI_01
		// HTTP/1.1
		// 0:0:0:0:0:0:0:1
		// 60843
		// 1 获取请求方式 GET
		String method = request.getMethod();
		System.out.println(method);

		// 2 获取虚拟目录 (根目录,项目名) /Servlet_01
		System.out.println(request.getContextPath());
		// 3 获取请求路径 /requestAPI_01
		System.out.println(request.getServletPath());

		// 4 获取get方式请求参数 name=123&pwd=root
		System.out.println(request.getQueryString());

		// 5 获取URI (基于服务器的相对路径) /Servlet_01/requestAPI_01
		System.out.println(request.getRequestURI());
		// 6 获取URL 基于服务器的绝对路径 http://localhost:8080/Servlet_01/requestAPI_01
		System.out.println(request.getRequestURL());

		// 7 版本 HTTP/1.1
		System.out.println(request.getProtocol());
		// 8 IP 0:0:0:0:0:0:0:1(客户端地址,本地显示0.0.0.....:1)
		System.out.println(request.getRemoteHost());
		// 9 端口 客户端端口63194
		System.out.println(request.getRemotePort());
	}
}

getHead

@WebServlet("/getHead")
public class getHead_05 extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// 获取所有的请求头的名称
		Enumeration<String> head = req.getHeaderNames();
		while (head.hasMoreElements()) {
			String name = head.nextElement();
			// 根据name获取请求头的值
			String value = req.getHeader(name);
			System.out.println(name + " : " + value);
		}

		// 判断浏览器
		String agent = req.getHeader("user-agent");
		if (agent.contains("Chrome")) {
			System.out.println("谷歌");
		} else if (agent.contains("Firefox")) {
			System.out.println("火狐");
		}
	}
}

referer

/*
 * 就是只能跳转才能相应请求, 不跳转直接在浏览器上写不会相应请求的
 * 直接在浏览器上头写/referer会显示下面这个
 * null
 * 请在爱奇艺播放
 * 
 * 从aaa标签跳转的就会显示正在播放
 * http://localhost:8080/Servlet_01/index.html
 * 正在播放
 */
@WebServlet("/referer")
public class referer_06 extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// 防盗链
		String referer = req.getHeader("referer");
		System.out.println(referer);
		if (referer == null) {
			System.out.println("请在爱奇艺播放");
		} else {
			System.out.println("正在播放");
		}
	}
}

doGet和doPost

public class getParameter_07 extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("正在使用doGet请求");
		// 设置字符编码
		req.setCharacterEncoding("UTF-8");
		// 获取参数
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		System.out.println(username + " : " + password);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("正在使用doPost请求");
		// 设置字符编码
		req.setCharacterEncoding("UTF-8");
		// 获取参数
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		System.out.println(username + " : " + password);
	}
}

版权声明:本文为dbndbndbn原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。