目录
重点归纳
注册servlet两种方法
发送请求,给出响应的流程
get和post区别
请求的转发和重定向
知识点
注册servlet方法一
在WEB-INF下的web.xml文件中注册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">
<servlet>
// 名字
<servlet-name>hello</servlet-name>
//路径
<servlet-class>com.jsoft.morning.servlet.HelloServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
// 请求要发送的位置的路径
<url-pattern>/hello.do</url-pattern>
</servlet-mapping>
</web-app>
注册方法二:
给在后台接收请求的servlet类加注释,便捷,较多使用
// 括号中是接收什么路径的请求
@WebServlet("/demo06.do")
请求的几种匹配路径
路径匹配
*为通配符,/user/* 意为user下的所有请求都可以匹配
<url-pattern>/user/*</url-pattern>
扩展名匹配
<!--<url-pattern>*.do</url-pattern>-->
默认匹配,缺省匹配
<url-pattern>/</url-pattern>
注:
如果使用路径匹配:必须有/
如果使用的是扩展名匹配:必须不能有/路径匹配和扩展名无法同时设置
面试题:/和/*的区别
/*属于路径匹配,匹配所有的请求,路径匹配优先级仅次于精确匹配
/*会覆盖所有的扩展名匹配,非常恶劣的匹配规则。
/是servlet中的特殊的匹配模式,优先级最低,不会覆盖任何的url-pattern
匹配所有的请求/和/*拦截静态资源
servlet初始化的方法
init方法什么时候执行?
默认当我们第一次访问servlet的时候被调用,延迟加载。
初始化方法只执行一次。
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet初始化...");
System.out.println(config.getInitParameter("username"));
System.out.println(config.getInitParameter("password"));
}
请求和响应
HttpServletRequest---request(请求)
所有和请求相关的操作都用这个对象来处理
当有请求的时候,request就被实例化
HttpServletResponse---response(回应)
所有和响应相关的操作都用这个对象来处理
当有请求的时候,response也被实例化了
给出响应时用response,且给出的响应必须显示在客户端(浏览器)
请求和响应成对出现
发送请求
a标签是可以传参数的
a标签和我们直接在地址栏输入的地址没有区别,他们的都是GET请求
<a href="login.do?username=admin&password=1234567">登录</a>
当我们使用form表单提交数据时,注意:
1、所有的表单元素都必须有name属性,后台获取数据的根基。
2、按钮必须是submit。
3、提交数据的地址
<form action="login.do" method="post">
<p>账号:<input type="text" name="username"></p>
<p>密码:<input type="password" name="password"></p>
<input type="submit" value="登录">
</form>
最常见的客户端的传参方式有两种:get/post
浏览器地址栏直接输入地址,一定是get请求
超级链接:get请求
表单:method= "get"、method="post"
面试题:
GET请求和POST请求的区别:
GET:请求的参数会显示在浏览器的地址栏中,不安全,
请求的长度限制在1k之内
GET请求没有请求体,无法通过request去设置参数
POST请求的参数不会再地址栏中显示,把请求的参数封装成了几个报文(请求体),请求的长度没有限制
给出响应
客户端和服务器端的信息传递
在后台需要有一个类接收前台发送的信息,在后台进行处理后给前台响应,这个类要继承HTTPServlet
接收get请求和post请求需要重写doget,dopost两个方法,两种方法方法体是一样的,可以在一个方法中调用另一个方法,在另一个方法中编写方法体即可
设置响应的字符集 一定要放在获取流之前 服务器处理字符串按照UTF-8处理
response.setCharacterEncoding("utf-8");
添加响应头,告诉浏览器以HTML的格式来解析响应字符串
response.addHeader("content-type","text/html;charset=utf-8");
IO流,用IO流将信息通过响应发送到前台
PrintWriter out = response.getWriter();
向客户端回复的数据
out.write("我是后台,已经接到了你的请求!!!");
流的操作:关流
out.flush();
out.close();
请求的转发与重定向
转发
由后台多个servlet类来处理同一个请求再返回给前台,作用域不变,数据可交互。
请求转发是在服务器上完成的,跟客户端是否无关!
getRequestDispatcher参数:转发的servlet的地址
forward参数:request,response,把当前servlet用的request和response传给下一个
request.getRequestDispatcher("demo03.do").forward(request,response);
重定向
在后台给出回应,让前台再发一次请求给另一个后台servlet类
resp.sendRedirect("index.html");
面试题:请求转发和重定向的区别
1.重定向是两次请求,请求转发是一个请求
2.重定向是客户端行为,请求转发是服务器行为
3.重定向浏览器地址会发生改变,转发不会
4.重定向可以定向到任意地址,转发只能项目内转发