Servlet
除了form表单之外都是get请求
- HttpServletRequest--- req——请求
- 所有请求的操作都用req对象来处理
- 当有请求来的时候,req就被实例化
- HttpServletResponse--- resp——响应
- 所有响应的操作都用resp对象来处理
- 当有响应来的时候,resp就被实例化
- 当你想要给出响应时,使用resp
- 我们要给出的响应,必须要展示在客户端(浏览器)
- 【servlet的匹配优先级最高】
- 如果使用路径匹配,必须有/
- 如果使用扩展名匹配,必须没有/
- 扩展名匹配与路径匹配无法同时设置
匹配规则
- 精确匹配-----------
中配置的项必须与url完全精确匹配。 - 扩展名匹配--------以“*.”开头的字符串被用于扩展名匹配
- 路径匹配-----------以“/”字符开头,并以“/*”结尾的字符串用于路径匹配
- 缺省匹配 (默认匹配)-------
/
任务
- Servlet就是一个普通的Java类而已。
- 处理请求,给出响应的类。
创建Sevlet
- 实现
javax.servlet.Servlet
接口 - 继承
javax.servlet.GenericServlet
类 - 继承
javax.servlet.http.HttpServlet
类
我们在开发中一般会使用第三种方法来创建Servlet。
Servlet生命周期
- 初始化---init方法。
- init方法什么时候执行
- 默认当我们第一次访问servlet的时候被调用,——延迟加载
- 初始化方法只执行一次
- init方法什么时候执行
- 实例化---构造器。
- 调用
service
方法,处理请求。 - 销毁---destory方法。
请求
常见的方法
System.out.println(req.getMethod()+"请求的方法");
System.out.println(req.getContextPath()+"请求的根路径");
System.out.println(req.getServletPath()+"请求的servletPath路径");
System.out.println(req.getRequestURI()+"请求的URI");
System.out.println(req.getRequestURL()+"请求的URL");
System.out.println(req.getScheme()+"请求的协议");
重要的方法——接受参数
// 接受参数,处理请求
String username = req.getParameter("username");
String password = req.getParameter("password");
接受参数
// 接受参数,处理请求
// 根据key获取value
String username = req.getParameter("username");
String password = req.getParameter("password");
// 复选框返回多个值
String[] hobbies = req.getParameterValues("hobby");
// 获取key的值,根据key的值获取value
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
String s = parameterNames.nextElement();
String parameter = req.getParameter(s);
}
//获取请求中传过来键值对,返回值是一个map集合;
// 这个map集合的key是String,value是String[];
Map<String, String[]> parameterMap = req.getParameterMap();
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
String key = entry.getKey();
String[] value = entry.getValue();
}
请求转发
- 由多个servlet来处理一个请求
- 请求转发是在服务器上完成的,根客户端无关
作用域
- 起作用的区域
req.setAttribute("name","张三");
// 获取
System.out.println("demo04.do-------->"+req.getAttribute("name"));
// 删除
req.removeAttribute("name");
req.getRequestDispatcher("/demo03.do").forward(req,resp);
响应
// 给出响应
// 客户端与服务端的信息传递
// resp.setContentType("text/html;charset=utf-8");
// 响应的字符集一定放在流之前
// 添加响应头,告诉浏览器以HTML的格式来解析响应字符串
resp.addHeader("content-type","text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("我是后台,已经接到你的请求了!!!");
// 写字符
writer.write("login success!!!");
// 写字节
writer.println("");
// 流的操作
writer.flush();
writer.close();
- 重定向
resp.sendRedirect("index.html");
Servlet的配置
web.xml
<?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">
<!-- 注册servlet -->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.jsoft.afternoon.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello.do</url-pattern>
</servlet-mapping>
</web-app>
注解
@WebServlet("/hello.do")
面试题
路径配置中【/与/*有什么区别】
- 【/*】——属于路径匹配,可以匹配所有的请求,路径匹配的优先级仅次于精确匹配的
- 会覆盖所有的扩展名匹配,非常恶劣的匹配规则(语法)
- 【/】——是servlet中的特殊匹配模式,优先级最低,不会覆盖任何的【url-patter】,匹配所有的请求
- /和/*拦截静态资源
GET和POST的区别
- GET:请求的参数会在浏览器的地址栏中显示,不安全;请求的长度限制在1k之内
- 没有请求体,无法通过request去设置参数。
- POST:请求的参数不会在浏览器的地址栏中显示,安全;没有长度限制
- 有请求体
请求转发和重定向的区别
- 重定向——是两次请求,是客户端行为,是浏览器的地址会发生改变,【重定向可以定义到任意地址】
- 请求转发——是一次请求,是服务器行为,浏览器地址不会发生改变,【转发只能项目内转发】