目录
Servlety映射路径
可以给servlet配置多个路径,包括精确匹配和模糊匹配
/*
*
精确匹配【使用的多】
配置的url与用户访问的url要一模一样才可以访问到对应的servlet.
模糊匹配使用一个通配符“*”号,代表任意0到多个字符,只有这一个通配符。
通配符匹配使用只有2种方式:
1.前缀匹配,必须以“/”开头,以“/*”结尾
例子,/abc/*,只要用户访问时以/abc/开头都可以匹配到
2.后缀匹配,必须以“*”开头,以“.”扩展名方式结束使用
例子,*.do,只要用户访问时以.do结尾都可以匹配到
优先级: 后缀模糊 < 前缀模糊 < 精确匹配
* */
@WebServlet(
urlPatterns = {
//精确匹配路径
"/Demo1Servlet",
//模糊匹配路径,
"/abc/*", //前缀匹配含义,只要访问以/abc/开头的路径都会匹配
"*.do", //后缀匹配含义,只要访问以“.do”结尾都会匹配
})
public class Demo1Servlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print("hello UrlPatterServlet");
}
}
1.前缀匹配,必须以“/”开头,以“/”结尾 例子,/abc/,只要用户访问时以/abc/开头都可以匹配到
2.后缀匹配,必须以“*”开头,以“.”扩展名方式结束使用 例子,*.do,只要用户访问时以.do结尾都可以匹配到
优先级: 后缀模糊 < 前缀模糊 < 精确匹配
ServletConfig配置参数
注解方式配置参数数据
@WebServlet(name = "UserServlet", urlPatterns = "/UserServlet",
initParams = {
@WebInitParam(name = "参数名1",value = "参数值1"),
@WebInitParam(name = "参数名2",value = "参数值1"),
}
)
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">
<!--配置Demo2Servlet-->
<servlet>
<servlet-name>Demo2Servlet</servlet-name>
<servlet-class>com.itheima.servlet._02ServletConfig读取配置参数.Demo2Servlet</servlet-class>
<!--给当前Servlet配置参数数据-->
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>20</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Demo2Servlet</servlet-name>
<url-pattern>/Demo2Servlet</url-pattern>
</servlet-mapping>
</web-app>
读取配置文件
//1.获取ServletConfig对象
ServletConfig servletConfig = getServletConfig();
//2.获取私有参数数据中key的名称列表
Enumeration<String> enumeration = servletConfig.getInitParameterNames();
//遍历迭代器
while(enumeration.hasMoreElements()) {
//获取当前key
String key = enumeration.nextElement();
//3.根据key获取对应value
String value = servletConfig.getInitParameter(key);
//输出
System.out.println(key+"="+value);
}
Http协议介绍和查看
hypertext transaction protocol
超文本传输协议,HTTP是一个简单的请求-响应协议,它通常运行在TCP/IP通信基础之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
http协议作用
规定了浏览器与服务器传输数据的格式
http协议是无状态,不会保存传输的数据, 保存数据需要浏览器客户端与服务器去做。
http协议内容的组成
请求数据部分
响应数据部分
http协议数据查看方式
使用浏览器开发者工具
使用专业抓包工具软件(Fillder抓包工具)查看(原生格式数据)
请求数据组成
注意:
请求数据由4个部分构成:请求行、请求头、空格、请求体
get提交数据,保存在请求行中
post提交数据,保存在请求体中
请求头相关信息简单介绍
请求头1—referer描述
用户访问行为说明:访问页面index1.html页面展现, 通过点击页面上的超链接跳转访问页面index2.html
第一次访问资源:index1.html
第二次访问资源:index2.html
第二次访问资源的请求头数据中referer=index1.html, 记录了上一个访问资源的地址
请求头2—if-Modified-Since
客户端浏览器缓存静态资源的最后修改时间,用于发给服务器校验资源是否被修改过。
200, 代表资源从服务器获取并在浏览器上显示,慢,从服务器获取
304, 代表资源从浏览器本地缓存获取再显示, 快,从缓存获取
注意:
静态资源才会有缓存时间
动态资源不会有缓存时间
请求头3——Connection
request对象介绍与作用
当浏览器提交请求数据给到服务器,服务器会创建一个对象接收所有请求数据,这个对象就是request
request作用1-获取请求数据
获取请求行数据
获取请求头数据
//1.获取所有请求头name名称列表
Enumeration<String> headerNames = request.getHeaderNames();
//2.遍历迭代每个name
while (headerNames.hasMoreElements()){
//3.根据每个请求头name获取对应value并打印
String name = headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name+":"+value);
}
获取请求体数据
//1.获取数据
//用户名
String name = request.getParameter("name");
//性别
String gender = request.getParameter("gender");
//城市
String city = request.getParameter("city");
//爱好
String[] hobbies = request.getParameterValues("hobby");
注意:
get 默认用的是utf-8 , 中文不会乱码
post 默认的是iso8859-1(欧洲拉丁码表),中文会乱码
解决Post提交中文数据乱码
request.setCharacterEncoding("utf-8"); //注意设置为utf-8 或 utf8 都可以
request作用2-请求转发页面跳转
@WebServlet("/OneServlet")
public class OneServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 目标:从当前OneServlet请求转发跳转到TwoServlet
* 语法: request.getRequestDispatcher("/资源路径").forward(request,response)
* 注意: 路径中不要写项目路径,格式必须为资源路径,因为转发跳转是服务器端项目内的资源跳转
*
* 转发跳转的特点:虽然服务器内部跳转了,但是浏览器访问的地址URL不变
* */
request.getRequestDispatcher("/TwoServlet").forward(request,response);
}
}
@WebServlet("/TwoServlet")
public class TwoServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//输出
response.getWriter().print("TwoServlet");
}
}
注意:
request请求转发跳转前后的地址:没有变化
response重定向页面跳转
@WebServlet("/One2Servlet")
public class One2Servlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 目标:从当前OneServlet重定向跳转到TwoServlet
* 语法: response.sendRedirect("/项目路径(虚拟目录)/资源路径")
*
* 重定向跳转的特点:浏览器端进行的跳转,所以URL会发生改变
* */
//response.sendRedirect("/day08/Two2Servlet"); 这里不可以将项目路径写死,否则以后更改了还需要手动修改代码
//动态获取项目路径:request.getContextPath()
response.sendRedirect(request.getContextPath()+"/Two2Servlet");
}
}
@WebServlet("/Two2Servlet")
public class Two2Servlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//输出
response.getWriter().print("Two2Servlet");
}
}
注意:
response重定向跳转:url改变了
主要不使用请求域,就使用重定向跳转
request作用3-作用域对象
request的生命周期:浏览器发出请求到服务器,服务器会为这一次请求创建request对象,当这一次响应结束后服务器会销毁request对象:所以request对象范围是一次请求内
@WebServlet("/One3Servlet")
public class One3Servlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 目标:在当前One3Servlet使用request请求域存储数据,跳转到Two3Servlet获取request中存储的数据
*
* 分析:request请求域存储数据只在一次请求内有效,所以One3Servlet跳转到Two3Servlet必须使用转发跳转
*请求域写入与读取数据语法:
* 写入语法: request.setAttribute(String str,Object obj);
* 读取语法: request.getAttribute(String str)
* */
//1.向请求域中写入数据key:"username", value:"播仔"
request.setAttribute("username","播仔");
//2.转发跳转到Two3Servlet
request.getRequestDispatcher("/Two3Servlet").forward(request,response);
}
}
@WebServlet("/Two3Servlet")
public class Two3Servlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 目标:从request请求域读取数据输出
* */
response.setContentType("text/html;charset=utf-8"); //设置输出数据解决乱码
//读取数据
String username = (String) request.getAttribute("username");
//输出数据
response.getWriter().print("username:"+username);
}
}
BeanUtils封装数据
//1.解决post提交中文乱码
request.setCharacterEncoding("utf-8");
//2.实例java对象User
User user = new User();
//3.获取请求数据所有键值对的Map集合
Map<String, String[]> map = request.getParameterMap();
try {
//4.使用BeanUtils进行封装,将map集合的数据封装待java对象User中
BeanUtils.populate(user,map); //抛出一个编译时异常,注意如果其中自动封装数据的类型不兼容会发生异常
} catch (Exception e) {
e.printStackTrace();
//抛出,通知用户
throw new RuntimeException(e);
}
//5.输出数据
System.out.println(user);