Web基础笔记Day01 Servlet

新建并启动web项目

项目起名 finish

编写index.html作为欢迎页,并新建web.xml配置

配置服务器

导航栏windows > preferences > server > Runtime Envirenment > Edit

启动项目

点击项目名 > run on server

启动成功

 这仅仅是在Eclipse运行,此时访问localhost8080不可访问,tomcat文件夹下也没有该项目

将项目打包

选择打包位置即可

 这里需要放在tomcat目录下的webapps下

运行被打包的项目

打开运行tomcat服务器(如在项目中运行,需要先关闭)

浏览器地址栏输入

文件夹中会自动生成myweb文件夹,里面内容与Eclipse中相同

在web.xml文件中设置error-page

浏览器向服务器提交请求

GET请求

通过表单发送GET请求

 发送的请求数据会显示在地址栏(不安全)

参数只能携带字符串,无法携带对象(如json对象)     数据量小

POST请求

将form表单method改为POST

GET请求的响应结果会被浏览器缓存,POST不会

因为使用GET请求向服务器获取数据时,浏览器很好判断两次GET请求是否相同,只需要比较uri

而POST请求向服务器发送音频,视频时,在不影响资源可用性的情况下允许两次上传同一资源的数据不一致,不好比较两次请求发送的数据是否相同,所以不缓存

常见向浏览器发送请求的方法

POST请求安全性高于GET

如果负责用户登录的Servlet指定只接收POST请求,则默认不接收GET请求,若提交方式不正确,则可判断为非法登录。

Servlet

宏观是Servlet规范的一个具体的接口

微观上是Servlet接口的一个实例对象,是运行在服务器上的java小程序(Server Applet)

Servlet生命周期

编写servlet实现Servlet接口

package myweb;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyServlet implements Servlet {
	// 无参构造器
	public MyServlet() {
		super();
		System.out.println("创建实例");
	}

	@Override
	public void destroy() {
		System.out.println("销毁实例");
	}

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

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

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("初始化实例");
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("执行实例的service方法");
	}

}

注册Servlet

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	version="4.0" metadata-complete="true">

	<!-- 设置错误提示页面 -->
	<error-page>
		<error-code>404</error-code>
		<location>/errors.html</location>
	</error-page>

	<!-- 注册Servlet -->
	<servlet>
		<servlet-name>myServlet</servlet-name>
		<servlet-class>myweb.MyServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>myServlet</servlet-name>
		<url-pattern>/test</url-pattern>
	</servlet-mapping>
	
	<!-- 设置默认打开页面 -->
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
</web-app>

启动项目在浏览器访问 localhost:8080/myweb/test

 

表明执行了Servlet中,无参构造器,init,service方法 但还没有destory

刷新浏览器

不断执行service()方法

换浏览器同时访问刷新效果相同

结论

说明编写的myServlet只有一个实例化对象,是单例模式,多线程的

在用户第一次访问Servlet时创建实例,只会执行一次无参构造器和init

每提交一次请求就会执行一次service方法

在整个项目结束时销毁执行destory      在下面右键点击stop

默认情况下,Servlet在web容器启动时是不会被实例化的

 web容器启动时创建Servlet实例

当用户第一次访问Servlet时创建会使第一个用户的访问速度变慢

所以对于对用户访问速度有影响的Servlet就让其在应用启动时实例化

数值表示优先级,大于等于0即可。否则不起作用

服务器中两个map

将上图中相同替换为匹配。(用词不当)

 获取ServletConfig实例

一个由sevlet容器来传递信息到一个servlet初始化时使用Servlet配置对象

这就是Servlet配置        是把它抽象成一个ServletConfig实例

 获取初始化值

 

运行

多个Servlet共用一个servletContext

设置域属性值 

在另一个Servlet获取域属性值

 可以获取到

对于属性进行修改

获取到更改后的值或获取删除了的值为null;

获取文件路径

 

定义基本的GenericServlet

创建一个抽象类,实现Servlet接口

将Service方法改为抽象方法,供子类实现。

 创建新的Servlet继承自GenericServlet,只实现Service方法即可。

....

实际开发中不需要自己定义有现成的。

编写HttpServlet

获取请求类型(get or post)

也不用自己定义,自带的有

编写LoginServlet继承HttpServlet

将该Servlet注册,然后在表单中使用post请求访问该Servlet,再通过地址栏get请求访问

平常写代码如果是只支持post请求就只重写doPost即可,默认不能使用get

两种方法都支持就在doGet中调用doPost

在Eclipse中快速定义Servlet

new

 

会自动继承HttpServlet类

指定url-pattern

选择实现的方法

删除不需要的部分

 完成

HttpServletRequest

请求的生命周期

当客户端浏览器将请求(字符序列)发送到服务器后,服务器会根据HTTP请求协议的格式对请求进行解析。同时,服务器会创建HttpServletRequest的实现类的RequestFacada的对象,即请求对象。在调用相应的set方法,将解析出的数据封装到请求对象中。此时HttpServletRequest实例就创建完成并初始化完毕了,也就是说请求对象是由服务器创建,当服务器向客户端发送响应结束后,实例对象被服务器销毁。一次请求对应一个请求对象,HttpServletRequest实例的生命周期很短暂

请求参数的获取

编写表单采用POST方法访问RegisterServlet

编写RegisterServlet

package myweb;

import java.util.Enumeration;
import java.util.Map;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegisterServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("get提交 跟我玩阴的是吧!");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) {
		System.out.println("用户注册程序");
		// 获取用户提交的数据
		System.out.println(request.getParameter("username"));
		System.out.println(request.getParameter("password"));
		System.out.println(request.getParameter("gender"));
		System.out.println("---------");
		// 获取所有请求参数名称
		Enumeration<String> names = request.getParameterNames();
		// 遍历枚举
		while (names.hasMoreElements()) {
			String eleName = names.nextElement();
			String eleValue = request.getParameter(eleName);
			System.out.println(eleName + "=" + eleValue);
		}
		System.out.println("---------");
		// 获取指定参数所有值
		String[] hobby = request.getParameterValues("hobby");
		for (String h : hobby) {
			System.out.println(h);
		}
		System.out.println("---------");
		// 获取存放请求参数的Map
		Map<String, String[]> map = request.getParameterMap();
		for (String key : map.keySet()) {
			System.out.println(key + "-" + request.getParameter(key));
		}
	}
}

填写表单数据,提交

服务器获取到

域属性

用于存放有名称的数据。只在Request请求中可以的被访问。

将RegisterServlet的doGet方法中编写如下

protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 像请求中放入属性
		request.setAttribute("nation", "China");
		request.setAttribute("name", "Chinese");
		// 从请求中删除指定域属性
		// request.removeAttribute("name");
		// 将请求转发给newServlet
		request.getRequestDispatcher("/new").forward(request, response);
	}

将NewServlet的doGet方法中编写如下

protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取指定名称域属性值
		String nation = (String) request.getAttribute("nation");
		String name = (String) request.getAttribute("name");
		System.out.println(nation + "---" + name);
		System.out.println("------------");
		// 获取所有域属性名称
		Enumeration<String> names = request.getAttributeNames();
		while (names.hasMoreElements()) {
			String name1 = names.nextElement();
			System.out.println(name1 + "=" + request.getAttribute(name1));
		}
	}

在浏览器中以get方式访问RegisterServlet

获取服务端相关信息

 将RegisterServlet的doGet方法中编写如下

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取url,uri
		StringBuffer requestURL = request.getRequestURL();
		String requestURI = request.getRequestURI();
		System.out.println("requestURL = " + requestURL);
		System.out.println("requestURI = " + requestURI);
		System.out.println("--------------------------");
		// 获取当前Web应用的根路径
		String contextPath = request.getContextPath();
		System.out.println("contextPath = " + contextPath);
		// 获取客户端IP地址
		String remoteAddr = request.getRemoteAddr();
		System.out.println("remoteAddr = " + remoteAddr);
		System.out.println("--------------------------");
		// 获取Servlet的精确路径
		System.out.println("ServletPath = " + request.getServletPath());
		// 获取Servlet中不确定的部分,注册Servlet时*匹配到的部分
		System.out.println("PathInfo = " + request.getPathInfo());
	}

在浏览器中以get方式访问RegisterServlet

Servlet请求时产生的中文乱码问题

表单通过POST请求提交到服务器的内容乱码,Tomcat9已经解决了GET方式的中文乱码问题

解决方式:


如何解决其他版本Tomcat的GET方式乱码问题?

修改Tomcat服务器的sever.xml文件

不推荐,如果服务器中有多个项目,则服务器重启会有影响


GET和POST中文乱码通用解决方案

如果确定是post则直接使用第一种方式即可

HttpServletResponse

Web服务器收到一个Http请求后,会针对每个请求创建一个HttpServletRequest对象和HttpServletResponse对象。若需要获取客户端提交请求的相关信息,则需要从HttpServletRequest中获取,若要向客户端发送数据,则需要通过HttpServletResponse对象来完成

向客户端发送数据

getWriter()方法

解决response的乱码问题

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值