JSP专精点lv+1

一、JSP入门

1.JSP:动态网页

  • 网页分为静态和动态
  • 动态网页需要使用到服务端脚本语言(JSP)
  • jsp就是在HTML中嵌套的java代码

2.tomcat解压后目录详解

  • bin : 可执行文件(startup.bat shutdown.bat)
  • conf : 配置文件(server.xml)
  • lib : tomcat依赖的jar文件
  • log : 日志文件(记录出错等信息)
  • temp : 临时文件
  • webapps : 可执行的项目(将我们开发的项目放入该目录)
  • work : 存放由jsp翻译成的java,以及编译成的class文件(jsp ->java->class)

3.服务器常见状态码

  • 200:一切正常
  • 300/301:页面重定向(跳转)
  • 404:资源不存在
  • 403:权限不足(如果访问a目录,但是a目录设置不可见)
  • 500:服务器内部错误(代码有误)

二、虚拟路径和虚拟主机

配置虚拟路径:apache-tomcat\config\server.xml

1.方式一 需要重启服务器

将web项目配置到 webapps 以外的目录
host标签中:<Context docBase=" " path=" " />
docBase:实际路径
path:虚拟路径(配置虚拟路径要么用绝对路径要么用相对路径(相对于webapps))
例子:<Context docBase="D:\study\JspProject" path="/JspProject" />

2.方式二 不需要重启服务器

D:\study\apache-tomcat\conf\Catalina\localhost
中新建"项目名.xml"
新增一行例子:<Context docBase="D:\study\JspProject" path="/JspProject" />

配置虚拟主机:
80 默认端口号(输入网址可省略)
输入www.xxx.com找localhost:xxx(端口号)

三、JSP执行流程

第一次访问:服务端将jsp翻译成java,再将java编译成class文件
第二次访问:直接访问class文件(如果服务端代码修改了,将会再访问时重新编译)

jsp
java-Servlet文件
class

jsp和Servlet可以相互转换,jsp翻译成的java文件继承HttpJspBase(本质是servlet文件),所以jsp本质就是servlet
早期开发写的就是Servlet,但是太过繁琐,所以采用jsp.
因为第一次请求服务端会有翻译和编译的过程,因此比较慢;后续访问可以直接访问class,因此速度较快.但是如果服务端修改了代码,则再次访问时,会重新翻译、编译.

四、JSP的页面元素

页面元素有 : HTML、java代码(脚本Scriptlet)、指令、注释

1.脚本

1.<%
       局部变量、java语句
   %>
2.<%!
       全局变量、定义方法
   %>
3.<%=输出%>  等于 out.print (注意!!!out.println()不能回车,想要回车:"<br/>")
  • 一般而言,修改web.xml、配置文件、java代码需要重启tomcat服务器
  • 但是如果修改 jsphtmlcssjs,不需要重启

2.指令

JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
语法格式如下:

<%@ directive attribute="value" %>

指令可以有很多个属性,它们以键值对的形式存在,并用逗号隔开。

JSP中的三种指令标签

指令描述
<%@ page … %>定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %>包含其他文件
<%@ taglib … %>引入标签库的定义
  • page的属性:
  • language : 指定jsp页面使用的脚本语言
  • import: 导入类
  • pageEncoding :jsp文件自身编码 jsp->java(将jsp转成java用的编码)
  • contentType : 浏览器解析jsp的编码
<%@ page language="java" contentType="text/html"; charset="UTF-8" pageEncoding="UTF-8" import="java.util.Date" %>

3.注释

  • html注释<!-- --> 可以用浏览器查看源码看到的注释
  • java注释// /* */
  • jsp注释 <%-- --%>

五、部署tomcat

  • 一般建议将eclipse中的tomcat与本地tomcat的配置信息保持一致:
  • 将eclipse中的tomcat设置为托管模式:[第一次] 创建tomcat实例后,双击该实例,选择Server
    Locations的第二项.

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

1.out: 输出对象,向客户端输出内容.

2.request: 请求对象,存储"客户端向服务端发送的请求信息"

  • request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。

suntianheng

a.request对象的常见方法:

方法描述
String getParameter(String name)根据请求的字段名key(input标签的name属性值),返回字段值value(input标签的value属性值)
String[] getParameterValues(String name)根据请求的字段名key,返回多个字段值value (常见为checkbox 多选按钮)
void setCharactorEncoding(“编码格式utf-8”)设置post方式的请求编码(不设置有默认编码,默认编码根据tomcat默认,tomcat7及以前默认iso-8859-1,tomcat8及以后默认utf-8)
getRequestDispacher(“B.jsp”).forward(request,response)请求转发的方式跳转页面 访问A页面跳转到B页面(A->B)
ServletContext getServerContext()获取项目的ServletContext对象(通过request对象获取ServletContext对象)

示例:

注册功能
register.jsp   (注册页) 跳转  show.jsp(展示页)
http://localhost:8888/com.neuedu.firstjsp/show.jsp?uname=zs&upwd=abc&uage=23&uhobbies=%E7%AF%AE%E7%90%83&uhobbies=%E4%B9%92%E4%B9%93%E7%90%83
   连接/文件?参数名1=参数值1&参数名2=参数值2&参数名3=参数值3
get提交方式:   method="get"  和  地址栏、超链接(<a href="xx">)请求方式   默认都属于get提交方式

b.get与post请求方式的区别:

  • 1.get方式在地址栏显示请求信息(地址栏能够容纳的信息有限,其实Http Get方法提交的数据大小长度并没有限制,而是IE浏览器本身对地址栏URL长度有最大长度限制:不同浏览器的限制不同,一般在2k-8K之间.);
  • 2.post方式不在地址栏显示请求信息;
  • 3.文件上传操作,必须是post方式,get方式会报错.

c.统一请求的编码 :

(1).get方式请求,如果出现乱码,解决方式:
 - 1.统一每一个变量的编码(不推荐)  new String(旧编码,新编码);    (构造器)  name = new String(name.getBytes("iso-8859-1","utf-8"));
 - 2.修改server.xml,一次性更改tomcat默认编码(在修改端口号的地方,加上URIEncoding="UTF-8"即可)(一般在tomcat7及以前默认iso-8859-1,tomcat8及以后默认utf-8).
   建议使用tomcat时,首先在server.xml中统一get方式的编码.
(2).post方式请求,如果出现乱码,解决方式:
 - request.setCharacterEncoding("UTF-8");

3.response:响应对象

a.response对象的常见方法

方法描述
void addCookie(Cookie cookie)服务端向客户端增加一个cookie对象
void sendRedirect(String location) thows IOException页面跳转的一种方式(重定向)
void setContentType(String type)设置服务端响应时编码(设置服务端contentType类型)

示例:登录

login.jsp(登录页面) -> check.jsp(检查页面,登录判断) -> success.jsp(如果成功跳转到success页面)
 response.sendRedirect("success.jsp");  重定向导致数据丢失,地址栏变成success.jsp
 request.getRequestDispatcher("success.jsp").forward(request,response); 请求转发,可以获取数据,并且地址栏没有改变(仍然保留转发时的页面地址栏check.jsp)

b.请求转发和重定向区别

请求转发:
request.getRequestDispatcher().forward();
重定向:
response.sendRedirect();

例如:
请求转发:
request.getRequestDispatcher("/student_list.jsp").forward(request,response);
重定向:
response.sendRedirect(request.getContextPath + "/student_list.jsp")

c.转发过程

  • 客户端首先发送一个请求到服务器,服务器匹配Servlet,并指定执行。当这个Servlet执行完后,它要调用getRequestDispacther()方法,把请求转发给指定的Servlet_list.jsp,整个流程都是在服务端完成的,而且是在同一个请求里面完成的,因此Servletjsp共享同一个request,在Servlet里面放的所有东西,在student_list.jsp中都能取出来。因此,student_list.jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端,整个过程是一个请求,一个响应。

d.重定向过程

  • 客户端发送一个请求到服务器端,服务器匹配Servlet,这都和请求转发一样。Servlet处理完之后调用了sendRedirect()这个方法,这个方法是response方法。所以,当这个Servlet处理完后,看到response.sendRedirect()方法,立即向客户端返回个响应,响应行告诉客户端你必须再重新发送一个请求,去访问student_list.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,在这两个请求互不干扰、相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。因此,在sendRedirect()里面是两个请求,两个响应。

  • Forward是在服务器端的跳转,就是客户端一个请求给服务器,服务器直接将请求相关参数的信息原封不动的传递到该服务器的其他jspServlet去处理。而sendRedirect()是客户端的跳转,服务器会返回客户端一个响应报头和新的URL地址,原来的参数信息如果服务器没有特殊处理就不存在了,浏览器会访问新的URL所指向的Servletjsp,这可能不是原来服务器上的webService了。

e.总结

   1、转发是在服务器端完成的,重定向是在客户端发生的;
   2、转发的速度快,重定向速度慢;
   3、转发是同一次请求,重定向是两次请求;
   4、转发地址栏没有变化,重定向地址栏有变化;
   5、转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成。

4.session(存在于服务端):会话对象

  • 浏览网站:从开始浏览到关闭是一次会话
  • 购物:浏览、付款、退出是一次会话

a.session对象的常见方法:

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

b.session机制

  • 客户端第一次请求服务端时(Cookie的JSESSIONIDsessionsessionId进行匹配),匹配失败,服务端会产生一个session对象(用于保存该客户的客户信息);并且每个session对象,都会有一个唯一的sessionId(用于区分其他session);
  • 服务端又会产生一个Cookie,并且该Cookiename=JSESSIONID,value=服务端sessionId的值;
    然后服务端会在响应客户端的同时,将该Cookie发送给客户端,到这里客户端就有了一个Cookie(JSESSIONID);
  • 因此,客户端的Cookie就可以和服务端的session一 一对应(JSESSIONID-sessionId)
  • 客户端第二/n次请求服务端时:客户端会先根据客户端Cookie中的JSESSIONID,去服务端的session中匹配sessionId匹配,如果匹配成功(CookieJSESSIONIDsessionsessionId),说明此用户不是第一次访问,无需登录,如果不匹配,说明没登陆过.

c.总结:

  • session存储在服务端(客户请求时,由服务端产生)
  • session是在同一个用户(客户)请求时共享(就是已经登陆过一次的用户,不需要再次登录,JSESSIONIDsessionId共享)
  • session的实现机制:第一次客户请求时,服务端产生一个sessionId并复制给CookieJSESSIONID然后发送给客户端,最终通过JSESSIONIDsessionId实现一一对应的关系

suntianheng

d.Cookie和session的区别:

sessioncookie
保存的位置服务端客户端
安全性较安全较不安全
保存的内容ObjectString
  • Cookie(存在于客户端,但不是客户端产生的)
  • Cookie不是内置对象(需要new):Cookie是由服务端产生的,再发送给客户端保存.
  • Cookie相当于本地缓存的作用: 客户端(在第二次访问网站时,可以直接在本地访问信息)→
    服务端(第一次访问网站,服务端把信息放到Cookie里面发送给客户端)
  • Cookie可以提高访问服务端的效率,但是安全性较差(账号密码存储到本机)
  • Cookie: key(name)=value 包含键值对(KV对)
  • javax.servlet.http.Cookie (是javax类产生的对象)

Cookie

一、Cookie方法:
public Cookie(String key(name) ,String value) Cookie的构造方法
String getName() 获取name
String getValue() 获取value
void setMaxAge(int expiry) 设置最大有效期 ()
二、Cookie过程:

1.服务端准备Cookie:
增加Cookieresponse
response.addCookie(Cookie cookie)
2.页面跳转(请求转发,重定向都可以把Cookie给客户端)
3.获取Cookierequest
客户端获取Cookie:
request.getCookies()

三、Cookie总结:

1.服务端增加Cookie:response对象;客户端获取Cookie:request对象
2.不能直接获取某一个单独对象,只能一次性将全部的Cookie拿到
通过查看源代码→网络→消息头→过滤消息头 中的信息发现,除了自己设置的Cookie对象外,还有一个nameJSESSIONIDCookie
建议cookie只保存英文、数字,否则需要进行编码、解码处理.

四、使用Cookie的经典案例

使用Cookie记住用户名功能
login.jsp(客户端):suntianheng
check.jsp(服务端):
suntianheng
A.jsp(客户端):
suntianheng

5.pageContext:JSP页面容器

6.application:全局对象

String getContextPath():虚拟路径
String getRealPath(String name):绝对路径(虚拟路径相对的绝对路径)

7.config:配置对象(服务器配置信息)

8.page:当前JSP页面对象(相当于java中的this)

9.exception:异常对象

七.四个范围对象:(小->大)

  • 1.pageContext: JSP页面容器 (说page对象其实是在说pageContext不是内置对象的page):当前页面有效
  • 2.request: 请求对象 :同一次请求有效
  • 3.session: 会话对象 :同一次会话有效
  • 4.application: 全局对象 : 全局有效(整个项目有效)

四个对象公有的方法

Object getAttribute(String name):根据属性名,获得属性值
void setAttribute(String name,Object obj):设置属性值(可以新增也可以修改)
 例如: setAttribute("A","B")  ;   //如果A对象之前不存在,则新建一个A对象;如果A对象之前已经存在,则将A对象的值修改为B;
void removeAttribute(String name) 	: 根据属性名,删除对象
  • 1.pageContext 当前页面有效(页面跳转后无效)
  • 2.request 同一次请求有效;其他请求无效(请求转发后有效,重定向后无效)
  • 3.session 同一次会话有效 (无论怎么跳转,都有效;关闭或切换浏览器后无效; 从登陆到退出之间都有效)
  • 4.application 全局变量 ,整个项目运行期间都有效(切换浏览器仍然有效);关闭服务或者其他项目访问无效.

多个项目共享、重启后仍然有效 : JNDI 可以做到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值