Day33-jsp

总结

我是最棒的!基础不牢,地动山摇!

表单提交的两种方式

  1. GET
    • 他会把提交的数据全部暴露在url地址栏上,不安全,效率相对高
    • 他对提交的数据有限制,不超过1KB
  2. POST
    • 他不会把提交的数据暴露在url地址栏上,安全

在表单提交中,绝大多数都是使用POST方式提交,其他情况使用GET方式

乱码问题

原因

浏览器传输数据到服务器时通过ISO-8859-1的编码格式传输,但是他不支持中文,就产生了乱码。我们需要UTF-8

解决办法

GET提交:tomcat8底层已经帮我们实现好了。如果是低版本的tomcat,需要在server.xml配置文件中配置端口的标签中加上URLEncoding 设置为UTF-8

POST提交:

  1. 先编码,再解码

  2. 获取参数之前,设置编码格式

    req.setCharacterEncoding("UTF-8");
    

HttpServletResponse响应对象

常用方法

//拼接字符串展示网页
resp.getWriter();
//一般在下载文件时用
resp.getOutputStream();

注意事项

响应对象的两种方法不能同时使用

Servlet的跳转方式

请求转发

req.getRequestDispatcher("url地址").forward(req,resp);

特点

  1. url地址栏不会发生改变,都是第一个url地址
  2. 多个Servlet共享同一个请求,也共享该请求携带的参数
  3. WEB-INF下面的是受保护的,但是请求转发可以访问
  4. 请求转发不能跨域访问
  5. 用的第一个的请求对象,最后一个的响应对象
    在这里插入图片描述

重定向

resp.reDirect("url地址")

特点

  1. url地址栏会发生改变,它会展示最后一个重定向的地址
  2. 它会发送2次请求,不能获取到参数
  3. 不能访问WEB-INF下面的资源,WEB=INF下面的资源受保护
  4. 可以进行跨域访问

使用场景

  1. 需要多个servlet要共享传递的参数,只能使用请求转发
  2. 如果要访问WEB-INF下面的资源,只能使用请求转发
  3. 请求转发有可能会造成数据重复提交,都用重定向,增删改操作。跨域访问只能使用重定向
  4. 其他情况,随机选择一种提交方式
    在这里插入图片描述

请求包含

不常用(其实就是不用)

作用域对象

对象范围
pageContextPageContext只能当前页面共享数据
requestHttpServletRequest请求对象,每次转发都是新的请求对象
sessionHttpSession一次会话,在同一次会话中,共享数据。同一浏览器
applicationServletContext当前应用对象,从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进行引入(静态引入)

静态引入特点:

  1. 可以引入jsp文件
  2. 可以引入html文件(会乱码)
  3. 可以引入片段(jspf)

动态引入特点

  1. 可以引入jsp页面
  2. 可以引入html界面(不会乱码)
  3. 不能引入jspf片段
//使用jsp:include标签

静态引入和动态引入的区别

  1. 静态引入html会乱码,引入html使用动态引入
  2. 静态引入能引入html,jsp,jspf,动态引入只能引入jsp,html
  3. 他们引入文件的契机是不同的,静态在运行之前就已经将文件合并起来,运行的时候只需要读取一个文件即可。动态运行,运行之后才将文件合并
  4. 可以引入html文件(会乱码)
  5. 可以引入片段(jspf)

动态引入特点

  1. 可以引入jsp页面
  2. 可以引入html界面(不会乱码)
  3. 不能引入jspf片段
//使用jsp:include标签

静态引入和动态引入的区别

  1. 静态引入html会乱码,引入html使用动态引入
  2. 静态引入能引入html,jsp,jspf,动态引入只能引入jsp,html
  3. 他们引入文件的契机是不同的,静态在运行之前就已经将文件合并起来,运行的时候只需要读取一个文件即可。动态运行,运行之后才将文件合并
  4. 除了引入html用动态,其他都用静态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值