项目起名 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
启动项目在浏览器访问 localhost:8080/myweb/test404 /errors.html myServlet myweb.MyServlet myServlet /test index.html
表明执行了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中快速定义Servletnew
会自动继承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则直接使用第一种方式即可
HttpServletResponseWeb服务器收到一个Http请求后,会针对每个请求创建一个HttpServletRequest对象和HttpServletResponse对象。若需要获取客户端提交请求的相关信息,则需要从HttpServletRequest中获取,若要向客户端发送数据,则需要通过HttpServletResponse对象来完成
向客户端发送数据getWriter()方法
解决response的乱码问题



