栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Web基础笔记Day01 新建项目,Servlet,HttpServletRequest,HttpServletResponse

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Web基础笔记Day01 新建项目,Servlet,HttpServletRequest,HttpServletResponse

新建并启动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("执行实例的Servlet方法");
	}

}
注册Servlet




	
	
		404
		/errors.html
	

	
	
		myServlet
		myweb.MyServlet
	
	
		myServlet
		/test
	
	
	
	
		index.html
	
启动项目在浏览器访问 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 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 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 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的乱码问题

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749523.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号