Day33
总结
我是最棒的!基础不牢,地动山摇!
表单提交的两种方式
- GET
- 他会把提交的数据全部暴露在url地址栏上,不安全,效率相对高
- 他对提交的数据有限制,不超过1KB
- POST
- 他不会把提交的数据暴露在url地址栏上,安全
在表单提交中,绝大多数都是使用POST方式提交,其他情况使用GET方式
乱码问题
原因
浏览器传输数据到服务器时通过ISO-8859-1的编码格式传输,但是他不支持中文,就产生了乱码。我们需要UTF-8
解决办法
GET提交:tomcat8底层已经帮我们实现好了。如果是低版本的tomcat,需要在server.xml配置文件中配置端口的标签中加上URLEncoding 设置为UTF-8
POST提交:
-
先编码,再解码
-
获取参数之前,设置编码格式
req.setCharacterEncoding("UTF-8");
HttpServletResponse响应对象
常用方法
//拼接字符串展示网页
resp.getWriter();
//一般在下载文件时用
resp.getOutputStream();
注意事项
响应对象的两种方法不能同时使用
Servlet的跳转方式
请求转发
req.getRequestDispatcher("url地址").forward(req,resp);
特点
- url地址栏不会发生改变,都是第一个url地址
- 多个Servlet共享同一个请求,也共享该请求携带的参数
- WEB-INF下面的是受保护的,但是请求转发可以访问
- 请求转发不能跨域访问
- 用的第一个的请求对象,最后一个的响应对象
重定向
resp.reDirect("url地址")
特点
- url地址栏会发生改变,它会展示最后一个重定向的地址
- 它会发送2次请求,不能获取到参数
- 不能访问WEB-INF下面的资源,WEB=INF下面的资源受保护
- 可以进行跨域访问
使用场景
- 需要多个servlet要共享传递的参数,只能使用请求转发
- 如果要访问WEB-INF下面的资源,只能使用请求转发
- 请求转发有可能会造成数据重复提交,都用重定向,增删改操作。跨域访问只能使用重定向
- 其他情况,随机选择一种提交方式
请求包含
不常用(其实就是不用)
作用域对象
对象 | 类 | 范围 |
---|---|---|
pageContext | PageContext | 只能当前页面共享数据 |
request | HttpServletRequest | 请求对象,每次转发都是新的请求对象 |
session | HttpSession | 一次会话,在同一次会话中,共享数据。同一浏览器 |
application | ServletContext | 当前应用对象,从tomcat开启直到tomcat关闭都能共享数据 |
作用域对象的使用
//设置值
req.setAtrribute();
//取值
req.getAttribute();
//删除值
req.removeAtrribute();
注意事项
在哪个作用域对象设置值,只能在对应的作用域进行取值
测试
package cn.itsource.scope;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/scope")
public class ScopeServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Integer REQ_NUM = (Integer)req.getAttribute("REQ_NUM");
if(REQ_NUM == null){
req.setAttribute("REQ_NUM", 1);
}else {
req.setAttribute("REQ_NUM", REQ_NUM+1);
}
HttpSession session = req.getSession();
Integer SESSION_NUM = (Integer)session.getAttribute("SESSION_NUM");
if(SESSION_NUM == null){
session.setAttribute("SESSION_NUM", 1);
}else {
session.setAttribute("SESSION_NUM", SESSION_NUM+1);
}
ServletContext app = req.getServletContext();
Integer APP_NUM = (Integer)app.getAttribute("APP_NUM");
if(APP_NUM == null){
app.setAttribute("APP_NUM", 1);
}else {
app.setAttribute("APP_NUM", APP_NUM+1);
}
req.getRequestDispatcher("/result").forward(req, resp);
}
}
结果处理
package cn.itsource.scope;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/result")
public class ResultServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
Integer REQ_NUM = (Integer)req.getAttribute("REQ_NUM");
writer.print("REQ_NUM : "+ REQ_NUM +"<br/>");
HttpSession session = req.getSession();
Integer SESSION_NUM = (Integer)session.getAttribute("SESSION_NUM");
writer.print("SESSION_NUM : "+ SESSION_NUM + "<br/>");
ServletContext app = req.getServletContext();
Integer APP_NUM = (Integer)app.getAttribute("APP_NUM");
writer.print("APP_NUM : "+ APP_NUM + "<br/>");
}
}
大家可以测试一把,可以很明显的发现各个作用域对象的不同之处。request只有在当前请求对象生效,session在不关闭浏览器的情况下生效,application则是在服务器未关闭的情况下生效
ServletContext(当前应用对象)
获取当前应用对象的几种方式
req.getServletContext();
super.getServletContext();
req.getSession().getServletContext();
设置全局初始化参数
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
全局初始化参数只能通过当前应用对象来获取
//获取上下文路径
ServletContext app = req.getServletContext();
app.getContextPath();
//获取绝对路径
app.getRealPath();
//获取全局的初始化参数
app.getInitParameter("encoding");
JSP
JSP的本质也是一个Servlet,从源码中可以看出
Servlet更适合做业务逻辑的处理
JSP则更适合页面的输出展示
JSP的基本语法
//使用<% %>在jsp文件中写java代码
//使用<%=变量 %>将变量的值展示到页面上
//使用<%! %>定义成员变量
JSP三大指令
指令的语法格式
<%@ 指令名 属性1="value1" 属性2="value2" ... %>
page指令
导包等作用
include指令
抽取相同部分,再使用include进行引入(静态引入)
静态引入特点:
- 可以引入jsp文件
- 可以引入html文件(会乱码)
- 可以引入片段(jspf)
动态引入特点
- 可以引入jsp页面
- 可以引入html界面(不会乱码)
- 不能引入jspf片段
//使用jsp:include标签
静态引入和动态引入的区别
- 静态引入html会乱码,引入html使用动态引入
- 静态引入能引入html,jsp,jspf,动态引入只能引入jsp,html
- 他们引入文件的契机是不同的,静态在运行之前就已经将文件合并起来,运行的时候只需要读取一个文件即可。动态运行,运行之后才将文件合并
- 可以引入html文件(会乱码)
- 可以引入片段(jspf)
动态引入特点
- 可以引入jsp页面
- 可以引入html界面(不会乱码)
- 不能引入jspf片段
//使用jsp:include标签
静态引入和动态引入的区别
- 静态引入html会乱码,引入html使用动态引入
- 静态引入能引入html,jsp,jspf,动态引入只能引入jsp,html
- 他们引入文件的契机是不同的,静态在运行之前就已经将文件合并起来,运行的时候只需要读取一个文件即可。动态运行,运行之后才将文件合并
- 除了引入html用动态,其他都用静态