JSP的数据传递和保存、转发、重定向

JSP简述

JSP是一种动态网页技术,Java Server Pages,Java + HTML ,HTML是作为页面内容显示,Java是作为动态逻辑处理。

它实质上是一种模板技术,然后通过Tomcat的Jasper组件,可以将其翻译为.java文件,然后编译运行。

它里面的每一块组成都会被翻译到.java文件的对应位置。

脚本:<% %> -> _jspService()方法内

表达式:<%= %> -> _jspService()方法内 的 out.print()

声明:<%! %> -> .java文件内的成员位置

掌握request和response的使用

1.1 JSP的九大内置对象

out:向页面输出内容

out.print(); // 它可以输出任何数据类型  将对应的数据类型转换为字符串 它用于向页面输出我们Java一些变量信息
out.write(); // 它只能输出字符(字符串)内容 它用于向页面输出HTML内容

request: 它代表的就是客户端的请求

response: 它代表的是服务端的响应

session: 会话技术

application:应用程序上下文

page: 它指代当前页面,当然如果是翻译后的,那么它指代当前对象

pageContext:它是用来获取其他作用域内容的 同样它也是页面的上下文

config: 它可以获取到初始化配置参数(web.xml)

exception:它能够获取到某个页面上出现的异常信息 一般要和<%@page errorPage=“error.jsp” %>结合使用

1.2 request内置对象

主要用于处理客户端请求

1、请求对象:request

request作用域:请求的范围,在一次请求的范围内

public String getParameter(String name)

HTML代码:

<input type= "text" name= "userName" >

JSP代码:

String userName =request.getParameter("userName );

:有快捷键Ctrl+Alt+向下的箭头就能复制上一行

2、获取同名的多个参数

HTML代码:

<input type="checkbox" name="mailId" value=" 10001"/>

<input type="checkbox" name="mailId" value="10002"/>

<input type="checkbox" name="mailId" value="10003"/>

<input type="checkbox" name="mailId" value="10004" />

<input type="checkbox" name="mailId" value="10005" />

JSP代码:

String[ ] mailId=request.getParameterValues("mailId ");

if(mailId!=null& mailId.length!=0){
 
//循环mailds访问提交的数据

}else{

//未提交与参数maild相关的数据

}

模拟一个注册:

<form action="doRegister.jsp" method="POST">
    <p>
        帐号:<input type="text" name="username" value="admin"/>
    </p>
    <p>
        密码:<input type="password" name="password" value="123456"/>
    </p>
    <p>
        爱好:
        <input type="checkbox" name="hobby" value="1"/>编程
        <input type="checkbox" name="hobby" value="2"/>学习
        <input type="checkbox" name="hobby" value="3"/>写作业
    </p>
    <p>
        <input type="submit" value="注册" />
    </p>
</form>
<%
	// 接收客户端的请求参数
	// 根据name属性获取对应value的值
	// 获取单个值的参数
	String username = request.getParameter("username");
	String password = request.getParameter("password");
	
	// 获取多个值的参数
	String[] hobbies = request.getParameterValues("hobby");
%>

<!-- out.print() -->
<%="接收到的用户名为:"+username  %> <br/>
<%="接收到的密码为:"+password  %> <br/>
<%
	out.print("接收到的爱好有:");
	for(String hobby : hobbies){
		out.print(hobby+" ");
	}
%>
  • String getParamepter(String name); 根据name获取value值 如果获取不到返回null
  • String[] getParamepterValues(String name); 根据name获取多个value值的参数
  • Map<String,String[]> getParamepterMap(); 将请求参数全部注入到Map集合
  • String getMethod(); 获取请求方式
  • String getRemoteAddr(); 获取客户端的IP地址
  • String getContextPath(); 获取项目的根路径
  • String getHeader(String name); 获取请求头信息
  • InputStream getInputStream(); 获取参数的字节输入流
  • void setAttribute(String name,Object val); 向request作用域存储信息 但是这个信息只能在同一次请求中有效
  • Object getAttribute(String name); 从request作用域提取信息 如果不存在则为null
  • RequestDispatcher getRequestDispatcher(String path); 获取请求转发对象
  • forward(request,response); 实现请求转发

1.3 get请求和post请求的区别

GET:

  • 地址栏会显示传递的参数
  • 一般来讲浏览器对GET请求有数据长度限制
  • URL具有传播性
  • 不安全

POST:

  • 地址栏不会显示传递的参数 通过请求体传输
  • 一般来讲浏览器没有数据长度限制
  • URL不具备传播性
  • 相对安全
1.3.1 post提交方式的中文乱码解决办法

在提交的JSP页面填入一句代码

语法:

request.setCharacterEncoding("utf-8");
1.3.2 get提交方式的中文乱码解决办法

方法一:治标

语法:

字符串.getBytes("ISO-8859-1"),"utf-8"

示例:

String userName = request.getParameter("username");

userName=new String(userName.getBytes("ISO-8859-1"),"utf-8");

方法二:治本

配置tomcat\conf\server.xmI文件

<Connector connectionTimeout " 20000" port="8080"

protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

1.4 response内置对象

response对象用于响应客户请求并向客户端输出信息

•获得客户机信息
	–getRequestURL	方法返回客户端发出请求时的完整URL。
	–getRequestURI	方法返回请求行中的资源名部分。
	–getQueryString 方法返回请求行中的参数部分。
	–getRemoteAddr	方法返回发出请求的客户机的IP地址
	–getRemoteHost	方法返回发出请求的客户机的完整主机名
	–getRemotePort	方法返回客户机所使用的网络端口号
	–getLocalAddr	方法返回WEB服务器的IP地址。
	–getLocalName	方法返回WEB服务器的主机名
	–getMethod		得到客户机请求方式
•获得客户机请求头
	–getHead(name)方法
	–getHeaders(Stringname)方法
	–getHeaderNames方法
•获得客户机请求参数(客户端提交的数据)getParameter(name)方法
	–getParameterValues(Stringname)方法
	–getParameterNames方法
	–getParameterMap方法  //做框架用,非常实用

1.5 转发和重定向

1. 转发(页面实现跳转了,请求的信息也一起转移)

用户进行一次请求,但是服务器内部自动完成了跳转,服务器的行为无形中延长了request作用域;所以用户看到的地址栏并不是应该的最后的跳转地址,依然是上一个地址。

RequestDispatcher对象 forward()方法

<%
//1、request.getRequestDispatcher("url").forward(request, response)
	//转发到register页面
	request.getRequestDispatcher("register.jsp").forward(request,response);
	//转发传递信息  response.setAttribute(键,Object);
	response.setAttribute("msg","注册成功!");// 相当于一个 key-value --> msg,注册成功
	//在另一个页面获取信息
	request.getAttribute("msg");//获取到的是一个Object
//2、<jsp:forward page="url" />
%>

2. 重定向(页面实现跳转了,但是请求的信息不一起转移)

用户进行一次请求,服务器只是提示用户要跳转但是自己没有进行跳转,所以不会转移信息。

将用户请求重新定位到一个新的URL

response.sendRedirect("url")

如果想让重定向也能传递信息要使用如下方法:

String mess = "成功";

mess = URLEncoder.encode(mess, "UTF-8");

response.sendRedirect(request.getContextPath()+"/index.jsp?mess="+mess);

在转到页面要使用如下方法:

String mess = request.getParameter("mess");

mess = URLDecoder.decode(mess, "UTF-8");

out.println(mess);

其中:?参数=的语法结构就是在传递参数;但是在传递中文时会出现乱码的情况,详细介绍请看前面的“中文乱码的解决”。

1.6 理解转发和重定向的区别[面试题]

请求转发:

  • 地址栏不变化 还是原来的请求
  • 请求转发它是一次请求
  • 请求转发它只能跳转到服务器内部的资源
  • 请求转发是服务器在帮助你进行页面跳转

重定向:

  • 地址栏会变化 变为新的请求地址
  • 重定向是两次请求
  • 重定向可以跳转到任意地址/资源
  • 重定向是服务器响应给客户端一个标识(302),然后客户端重新进行页面跳转

1.7 session内置对象

使用场景:你在登录某个网站,登录之后,发现在这个网站中任意跳转该网站所属页面,你的登录信息一直展示着。你的购物车里的商品(未登录)。

如何理解session在一次会话中存储的数据均有效。

我们都打过电话,在一次通话中,你请求了n次,同时对方也响应了n次。

同理,我们所谓的一次会话其实就可以类比一次通话,他表示你访问某个网站的并进行不同的请求,都会得到服务器不同的响应,这个过程就是一次会话,只要你没有停止对该网站的访问,那么都是在一次会话当中。

通话开始:你给服务器发送一次请求。

通话结束:(默认)当你完全关闭某个浏览器,或者更换了浏览器之后,对应的session会销毁,会话结束。

1.7.1 session对象常用方法
  • void setAttribute(String name,Object value); 向session作用域存储内容 这个内容在同一次会话中都是有效的

  • Object getAttribute(String name); 从session作用域中取出内容

  • void removeAttribute(String name); 从session作用域移除内容

  • String getId(); 获取当前session的编号

  • void invalidate(); 作废session

  • void setMaxInactiveInterval(int seconds); 设置session非活动有效期(默认为30分钟)

  • int getMaxInactiveInterval(); 获取session非活动有效期

1.7.2 session中的setAttribute()作用域是一次会话

会话:一个会话就是浏览器和服务器之间的一次通话;会话可以在多次请求中保存和使用数据;一个会话就是在一段时间内,一个客户端与Web服务器的一连串相关的交互过程;会话可以在多次请求中保存和使用数据:

public void setAttribute(String name, Object value);

用法:session.setAttribute("userName","张三丰");

public Object getAttribute(String name);

用法:String username=(String) session.getAttribute("userName");
1.7.3 session与窗口的关系
  • 每个session对象都与一个浏览器窗口对应 ,重新开启一个浏览器窗口,可以重新创建一个session对象(不同版本浏览器可能有所差别)
  • 通过超链接打开的新窗口,新窗口的session与其父窗口的session相同

session是一种机制,是服务器端使用的用来记录同一个客户端状态的一个机制—sessionId来判断哪个客户端:session.getId(); public String getId(); 【得到当前客户端的编号,每一个session有一个唯一的sessionId】

同一个浏览器不管打开多少次都会显示同一个客户ID;不同的浏览器的到的客户ID不同

1.7.4 会话的清除和过期

Session的数据是在服务器端的,服务器保存的会话数据量会越来越大,从而导致性能问题;所以若没有清理机制,会导致性能问题或服务器崩溃:

  1. 程序主动清除session数据

手动设置失效:session.invalidate() 【程序里最常用的方法】

移除会话的一个属性:

public void setAttribute(String name);

用法:session.removeAttribute("userName");
  1. 服务器主动清除长时间没有再次发出请求的session

设置会话过期时间超时失效:

方法一:通过setMaxInactiveInterval( )方法,单位是秒

public void setMaxInactiveInterval (int Interval);

示例:

<%

session.setAttribute("login","admin");

session.setMaxInactiveInterval(600);

response.sendRedirect("admin.jsp");

%>

方法二:通过设置项目的web.xmlTomcat目录下的/conf/web.xml文件,单位是分钟

<session-config>

    <session-timeout>10</session-timeout>

</session-config>

1.8 掌握cookie和session的区别[面试题]

一些网站里例如百度在搜索时有历史记录提示

一些网站里登录时可以勾选7天免登录或者记住我等功能

cookie它和客户端有关。

实质上session使用到的就是会话级的cookie。当浏览器第一次访问服务器时,服务器会生成一个session
并且将session的id写入到浏览器的会话级cookie,当浏览器访问服务器时,会携带此cookie,服务器会对cookie中的session
id进行验证,如果有则表示是同一次会话,否则说明会话不存在或者已经过期了,那么就会重复之前的步骤。

Cookie和Session区别

  • cookie只能存储String类型的值,而session可以存储任意类型的内容
  • cookie可以设置会话级也可以设置持久级,而session只能是会话级
  • cookie是客户端存储的内容,而session是服务器存储的内容
  • cookie不够安全,session相对安全,一些重要信息推荐放在session中

1.9 cookie

1.9.1 cookie对象的常用方法
  • void setMaxAge(int expiry) 设置cookie的有效期,以秒为单位

  • void setValue(String value) 在cookie创建后,对cookie进行赋值

  • String getName() 获取cookie的名称

  • String getValue() 获取cookie的值

  • int getMaxAge() 获取cookie的有效时间,以秒为单位

  • setPath("/") 设置返回值,加上setPath("/");这句话说明cookie对于整个工程是可见的,如果不加这句话cookie只对当前这个路径和它的子目录可见;

1.9.2 cookie以文件方式保存数据
添加Cookie
<%
 			//添加到cookie
            Cookie cookie = new Cookie("name", userName);
            //设置有效期1天
            cookie.setMaxAge(60*60*24);
            //添加到cookie
            response.addCookie(cookie);
%>

获取cookie
<%
    //获取cookie
    Cookie [] cookies = request.getCookies();
    String name = "";
    for (int i = 0; i < cookies.length; i++) {
        if (cookies[i].getName().equals("name")) {
            name =  cookies[i].getValue();
        }
    }
%>

2.0 cookie与session的对比

  1. session:

    • 在服务器端保存用户信息
    • session中保存的是Object类型
    • 随会话的结束而将其存储的数据销毁
    • 保存重要的信息
  2. Cookie:

    • 在客户端保存用户信息
    • cookie保存的是 String类型
    • cookie可以长期保存在客户端
    • 保存不重要的用户信息

2.1 application内置对象

2.1.0 application对象的常用方法
  • void setAttribute(String key,Object value) 以key/value的形式保存对象值

  • Object getAttribute(String key) 通过key获取对象值

  • String getRealPath(String path) 返回相对路径的真实路径

2.1.1 application使用

示例:统计网站访问次数的实现:一个用户进行多次刷新页面 多个用户访问页面

分析

  • 每个用户都需要使用访问次数
  • application可在整个项目中共享使用数据
  • 使用application实现计数器
  • 每次访问该页面,计数器加1

解决方法

public void setAttribute(String name, Object object)
application.setAttribute(String name, Object object);

public Object getAttribute(String name)
application.getAttribute(String name);

统计页:

<%
       Integer count = (Integer) application.getAttribute("count");
       if (count != null) {
              count = 1 + count;
       } else {
              count = 1;         
       }
       application.setAttribute("count", count);
%>

显示页:

<%
       Integer i = (Integer) application.getAttribute("count");

       out.println("您好,您是第 " + i + " 位访问本网站的用户");
%>

但是服务器停了之后重新启动就会重新计数

2.1.2 三个对象对比

requestsessionapplication

相同点:都可以存储属性

不同点

  • request中存储的数据仅在一个请求中可用
  • session中存储的数据在一个会话的有效期内可用
  • application中存储的数据在整个Web项目中可用

2.2 JSP常用内置对象的作用域

  1. page作用域

    对应的作用域访问对象为pageContext 对象

    page的作用域指本JSP页面的范围:

    pageContext.setAttribute(键,值)

    pageContext.getAttribute(键)


  1. request作用域

    对应的作用域访问对象为request 对象

    request的作用域内的对象则是与客户端的请求绑定在一起


  1. session作用域

    对应的作用域访问对象为session 对象

    session的作用域是一次会话


  1. application作用域

    对应的作用域访问对象为application 对象

    application的作用域是面对整个Web应用程

在这里插入图片描述

2.3 JavaBean

就是一个Java类
封装业务逻辑
封装数据

2.3.1 JavaBean的优势
  • 解决代码重复编写,减少代码冗余
  • 功能区分明确
  • 提高了代码的维护性
2.3.2 JavaBean的功能上可以分为
  • 封装数据
  • 封装业务

在这里插入图片描述

2.3.3 封装数据的JavaBean

在这里插入图片描述

技巧

使用工具自动生成getter/setter方法:

Alt+Shift+S —> Generate Getters and Setters

除了要建立的util包之外一般还有service包

名字都是:***Service:接口 <— 业务逻辑

Dao(接口)—> DaoImpl(接口实现类):数据库的数据操作

一般一个Dao对应一张数据表(*******)

总结

在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值