欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jsp详细总结(指令,Cookie,Session,response,分页)

程序员文章站 2022-06-28 17:44:16
一.开发项目前的配置1.使用Eclipse开发Web项目(JSP项目) tomcat2.在Eclipse中创建的Web项目:浏览器可以直接访问 WebContent中的文件,例如http://localhost:8888/MyJspProject/index1.jsp其中的index1.jsp就在WebContent目录中; 但是WEB-INF中的文件无法通过客户端(浏览器)直接访问,只能通过请求转发来访问注意:并不是 任何的内部跳转都能访问WEB-INF;原因是 跳转有2种方式:请求转...

一.开发项目前的配置

1.使用Eclipse开发Web项目(JSP项目) tomcat

2.在Eclipse中创建的Web项目:

  • 浏览器可以直接访问 WebContent中的文件,
    例如http://localhost:8888/MyJspProject/index1.jsp
    其中的index1.jsp就在WebContent目录中; 但是WEB-INF中的文件
    无法通过客户端(浏览器)直接访问,只能通过请求转发来访问

注意:并不是 任何的内部跳转都能访问WEB-INF;原因是 跳转有2种方式:请求转发 、重定向

3.配置tomcat运行时环境

  • jsp<->Servlet
  • a.将tomcat/lib中的servlet-api.jar加入项目的构建路径
  • b.右键项目->Build Path -> Add library ->Server Runtime

4.部署tomcat

  • 在servers面板 新建一个 tomcat实例 , 再在该实例中 部署项目(右键-add)之后运行

注意:一般建议 将eclipse中的tomcat与 本地tomcat的配置信息保持一致: 将eclipse中的tomcat设置为托管模式:【第一次】创建tomcat实例之后, 双击,选择Server Location的第二项

5.统一字符集编码

  • a.编码分类:
    设置jsp文件的编码(jsp文件中的pageEncoding属性): jsp -> java
    设置浏览器读取jsp文件的编码(jsp文件中content属性)
    一般将上述设置成 一致的编码,推荐使用UTF-8
    文本编码:
    i.将整个eclipse中的文件 统一设置 (推荐)
    ii.设置 某一个项目
    iii.设置单独文件

二.jsp基础知识

JSP的页面元素: HTML java代码(脚本Scriptlet)、指令、注释
1.脚本Scriptlet

i.    
	<%
			局部变量、java语句
	%>
ii.
	<%!
			全局变量、定义方法
	%>
iii.
	 <%=输出表达式 %>

一般而言,修改web.xml、配置文件、java 需要重启tomcat服务
但是如果修改 Jsp\html\css\js ,不需要重启
2.指令
page指令

  • <%@ page …%>

page指定的属性:

  • language:jsp页面使用的脚本语言

import:导入类

  • pageEncoding:jsp文件自身编码 jsp ->java

contentType:浏览器解析jsp的编码

  • <%@ page language=“java” contentType=“text/html; charset=UTF-8”
    pageEncoding=“UTF-8” import=“java.util.Date” %>

3.注释

  • html注释 ,可以被客户 通过浏览器查看源码 所观察到
  • java注释// //
  • jsp注释<%-- --%>

4.JSP九大内置对象(自带的,不需要new也能使用对象)

  1. out:输出对象,向客户端输出内容
  2. request:请求对象;存储“客户端向服务端发送的请求信息”
  3. request对象的常见方法:
    • String getParameter(String name) :根据请求的字段名key (input标签的name属性值) ,返回字段值value (input标签的value属性值)
    • String[] getParameterValues(String name): 根据请求的字段名key ,返回多个字段值value (checkbox)
    • void setCharacterEncoding(“编码格式utf-8”) :设置post方式的请求编码 (tomcat7以前默认iso-8859-1,tomcat8以后改为了utf-8)
    • getRequestDispatcher(“b.jsp”).forward(request,response) ; :请求转发 的方式跳转页面 A - > B
    • ServletContext getServerContext():获取项目的ServletContext对象

4.统一请求的编码 request
1.get方式请求 如果出现乱码,解决:(请求乱码)

  • a.统一每一个变量的 编码 (不推荐)
    new String( 旧编码,新编码);
    name = new String(name.getBytes(“iso-8859-1”),“utf-8”);

  • 修改server.xml ,一次性的 更改tomcat默认get提交方式的编码 (utf-8)
    建议 使用tomcat时, 首先在server.xml中 统一get方式的编码… URIEncoding=“UTF-8”

tomcat7 (iso-8859-1)
tomcat8(utf-8)

2.post 方式请求 如果出现乱码,解决:

request.setCharacterEncoding(“utf-8”) ;

5.response :响应对象
提供的方法:

  • void addCookie( Cookie cookie ); 服务端向客户端增加cookie对象
  • void sendRedirect(String location ) throws IOException; :页面跳转的一种方式(重定向)
  • void setContetType(String type):设置服务端响应的编码(设置服务端的contentType类型)
  • 中文乱码(响应乱码)

response.setContentType(“text/html”; charset=“UTF-8”);
response.setCharacterEncoding(“utf-8”);

转发、重定向:

转发:

  • 张三(客户端) -> 【 服务窗口 A (服务端 ) -> 服务窗口B 】

重定向:

  • 张三(客户端) -> 服务窗口 A (服务端 ) ->去找B
  • 张三(客户端) -> 服务窗口 B (服务端 ) ->结束

6. session(服务端)
Cookie(客户端,不是内置对象):Cookie是由 服务端生成的 ,再发送给客户端保存。
相当于 本地缓存的作用: 客户端(hello.mp4,zs/abc)->服务端(hello.mp4;zs/abc)
作用:提高访问服务端的效率,但是安全性较差。

Cookie: name=value
javax.servlet.http.Cookie

  • public Cookie(String name,String value) //构造方法
  • String getName(): //获取name
  • String getValue(): //获取value
  • void setMaxAge(int expiry); //最大有效期 (秒)

服务端准备Cookie:

  • response.addCookie(Cookie cookie)
  • 客户端获取cookie: request.getCookies();

a.服务端增加cookie :response对象;客户端获取对象:request对象
b.不能直接获取某一个单独对象,只能一次性将 全部的cookie拿到

通过F12可以发现 除了自己设置的Cookie对象外,还有一个name为 JSESSIONID的cookie

建议 cookie只保存 英文数字,否则需要进行编码、解码

7.session会话:

  • 客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息);

  • 并且每个session对象 都会有一个唯一的 sessionId( 用于区分其他session);

  • 服务端由会 产生一个cookie,并且 该cookie的name=JSESSIONID ,value=服务端sessionId的值;

  • 然后 服务端会在 响应客户端的同时 将该cookie发送给客户端,至此 客户端就有了 一个cookie(JSESSIONID);

  • 因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID - sessionID)

  • 客户端第二/n次请求服务端时:服务端会先用客户端cookie种的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功(cookie jsessionid和sesion sessionid),说明此用户 不是第一次访问,无需登录;

1.session方法:

  • String getId() :获取sessionId
  • boolean isNew() :判断是否是 新用户(第一次访问)
  • void invalidate():使session失效 (退出登录、注销)
  • void setAttribute()
  • Object getAttribute();
  • void setMaxInactiveInterval(秒) :设置最大有效 非活动时间
  • int getMaxInactiveInterval():获取最大有效 非活动时间

cookie和session的区别:

session cookie
保存的位置 服务端 客户端
安全性 较安全 较不安全
保存的内容 Object String

三.分页SQL

假设每页显示10条数据

1.mysql分页:

mysql:从0开始计数

结论:
分页:
第n页的数据: 第(n-1)10+1条 – 第n10条
mysql的分页语句:
limit 开始,多少条

select * from student limit 页数*页面大小,页面大小

2.sqlserver/oracle:从1开始计数

第n页 开始 结束
1 1 10
2 11 20
3 21 30
n (n-1)10+1 n10

select *from student where sno >=(n-1)10+1 and sno <=n10 ; --此种写法的前提:必须是Id连续 ,否则 无法满足每页显示10条数据

–1.如果根据sno排序则rownum会混乱(解决方案:分开使用->先只排序,再只查询rownum) 2.rownum不能查询>的数据

select s.* from student s order by sno asc;

select rownum, t.* from
(select s.* from student s order by sno asc) t
where rownum >=(n-1)10+1 and rownum <=n10 ;

3.oracle的分页查询语句:

select *from 
(
	select rownum r, t.* from
	(select s.* from student s order by sno asc) t 		
)
where r>=(n-1)*10+1 and <=n*10  ;	

优化:

select *from 
(
	select rownum r, t.* from
	(select s.* from student s order by sno asc) t 		
	where rownum<=n*10 
)
where r>=(n-1)*10+1  ;	

select *from 
(
	select rownum r, t.* from
	(select s.* from student s order by sno asc) t 		
	where  rownum<=页数*页面大小 
)
where r>=(页数-1)*页面大小+1  ;	

4.QLServer分页: 3种分页sql

row_number() over(字段) ;

  1. sqlserver2003:top --此种分页SQL存在弊端(如果id值不连续,则不能保证每页数据量相等)
select top 页面大小 * from student where id not in 
( select top (页数-1)*页面大小 id from student  order by sno asc )

2.sqlserver2005之后支持:

select *from 
(
	select row_number()  over (sno order by sno asc) as r,* from student
			
	 where r<=n*10 
)
where r>=(n-1)*10+1 ;	

SQLServer此种分页sql与oralce分页sql的区别: 1.rownum ,row_number() 2.oracle需要排序(为了排序,单独写了一个子查询),但是在sqlserver 中可以省略该排序的子查询 因为sqlserver中可以通过over直接排序

3.sqlserver2012之后支持:
offset fetch next only

select * from student order by sno 
offset (页数-1)*页面大小+1  rows fetch next 页面大小  rows only ;

4.分页实现

5个变量(属性)
1.数据总数 100 103 (查数据库,select count(*)…)
2.页面大小 (每页显示的数据条数)20 (用户自定义)
3.总页数 (程序自动计算)
总页数 = 100/20 =数据总数/页面大小
总页数 = 103/20 = 数据总数/页面大小+1
—>
总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;

4.当前页(页码) (用户自定义)
5.当前页的对象集合(实体类集合):每页所显示的所有数据 (10个人信息)
List (查数据库,分页sql)

本文地址:https://blog.csdn.net/weixin_43973404/article/details/110825129

相关标签: 前端 java