全名为Java Server Pages,其根本是一个简化的Servlet设计,实现了在Java当中使用HTML标签。JSP是一种动态网页技术标准,也是JavaEE的标准,JSP与Servlet同样,是在服务器端执行的。
软件开发三大方向:php
JDK , Tomcat, IDE
推荐:JDK1.7,Tomcat7.0,MyEclipse10
目录 | 说明 |
---|---|
/bin | 存放各类平台下用于启动和中止Tomcat的命令文件 |
/conf | 存放Tomcat服务器的各类配置文件 |
/lib | 存放Tomcat服务器所需的各类JAR文件 |
/logs | 存放Tomcat的日志文件 |
/temp | Tomcat运行时用于存放临时文件 |
/webapps | 当发布Web应用时 |
/work | Tomcat把由JSP生成的Servlet放于此目录下 |
修改 Tomcat的conf/server.xml的:html
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改Port就能成功修改Tomcat的默认端口java
JSP 适合分布式的,Hadoop
页面元素组成:web
指令 | 说明 |
---|---|
page | 一般位于JSP页面的顶端,同一个页面能够有多个page指令 |
include | 将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句 |
taglib | 使用标签库定义新的自定义标签,在JSP页面中启用定制行为 |
语法:数据库
<%@ page 属性1="属性值" 属性2="属性值1,属性值2"... 属性n="属性值n" %>
属性 | 描述 | 默认值 |
---|---|---|
language | 指定JSP页面使用的脚本语言 | Java |
import | 经过该属性来引用脚本语言中使用到的类文件 | 无 |
contentType | 用来指定JSP页面所采用的编码方式 | text/html,ISO-8859-1 |
HTML 注释express
<!-- HTML 的注释 --> //客户端可见,审查元素时
JSP的注释:数组
<%-- JSP 的注释 -- %> //客户端不可见
JSP 脚本注释:客户端不可见浏览器
// 单行注释 /* 多行注释 */
语法:缓存
<% Java代码 %>
在JSP中定义变量或者方法
语法:tomcat
<%! Java代码%>
例子:
<%! String s = "张三"; //声明了一个字符串 int add(int x, int y){ //声明了一个函数,返回两个整数的求和 return x+y } %>
JSP中执行的表达式
<%= 表达式%> // 注意表达式不以分号结束
JSP内置对象是web容器建立的一组对象,不用new关键字就可使用的内置对象
<% int[] value = {60,70,80} for(int i:value){ out.println(i) } %>
JSP内置对象:
JspWriter类的实例,向客户端(浏览器)输出内容经常使用的对象
经常使用方法以下:
客户端的请求信息被封装在Request对象中,经过它才能了解到客户的需求,而后作出响应。它是HttpServletRequest类的实例。request对象具备请求域,即完成客户端的请求以前,该对象一直有效。
<form name=“regForm” action = “动做” method=“提交方式”></from>
get:以明文的方式经过URL提交数据,数据在URL中能够看到。提交的数据量最多不超过2KB。安全性较低但效率比post方式高。适合提交数据量不大,安全性不高的数据。好比:搜索、查询等功能。
例如结果以下:
http://localhost:8080/ServletDemo/dologin.jsp?username=12&password=12
post:将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高的用户信息。好比:注册,修改,上传等功能
<h1>request 内置对象</h1> <% request.setCharacterEncoding("utf-8"); %> 用户名:<%=request.getParameter("username")%><br> 爱好:<% String[] favorites = request.getParameterValues("favorite"); for (int i = 0; i < favorites.length; i++) { out.println(favorites[i]+"  "); } %>
request.setCharacterEncoding("utf-8”);
避免中文在客户端显示乱码
经过URL提交表单,若是是中文可能还会乱码
解决方法:配置Tomcat
tomcat的conf目录下的 server.xml
<connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="88433" URIEncoding="utf-8" />
须要重启Tomcat生效
如咱们在解析request时候,能够设置默认项(密码):
request.setAttribute("password", "123456");
而后读取这个值
密码:<%=request.getAttribute("password")%>
包含了响应客户端请求的有关信息,可是在JSP中不多使用到它。它是HttpServletResponse类的实例。response对象具备页面做用域,即访问一个页面时,该页面的response对象只能对此次访问有效,其余页面的response对象对当前页面无效
区别:
- out和response.getWriter的类不同,一个是JspWriter,另外一个是java.io.PrintWriter。
- 执行原理不一样:JspWriter至关于一个带缓存功能的printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的缓冲区后再输出,response.getWriter直接输出数据(response.print()),因此(out.print)只能在其后输出。 (若是想要out对象强制在前输出,能够out以后使用flush()方法)
- out为jsp的内置对象,刷新jsp页面,自动初始化得到out对象,因此使用out对象是须要刷新页面的,而response.getWriter()响应信息经过out对象输出到网页上,当响应结束时它自动被关闭,与jsp页面无关,无需刷新页面。「形象的比喻:当咱们调用response.getWriter()这个对象同时得到了网页的画笔,这时你就能够经过这个画笔在网页上画任何你想要显示的东西。」
- out的print()方法和println()方法在缓冲区溢出而且没有自动刷新时候会产生ioexception,而response.getWrite()方法的print和println中都是抑制ioexception异常的,不会有ioexception 。
请求转发与请求重定向的区别:
- 请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变
- 请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变
例子:办理护照
重定向:你先去了A局,A局的人说:“这事不归咱们管,去B局”,而后你从A退了出来,乘车去了B局
转发:你去了A局,A局看了之后,知道这个事情应该B局管,没有退出来,让你坐了一会,本身倒了后面办公室联系了B的人,让他们办好后,送了过来。
在服务器的内存中保存着不一样用户的session,每个用户一个session。
若是没有对象绑定在该名称,返回Null
当客户端第一次访问某个JSP或者servlet时候,服务器会为当前会话建立一个sessionId,每次客户端向服务器发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验
注意事项:注意原有会话还存在,只是这个旧的sessionId仍存在服务端,只是再也没有客户端会携带它而后交于服务端校验
session的销毁方式只有三种:
设置超时时间两种方式:
<session-config> <session-timeout> 10 //分钟 </session-timeout> </session-config>
指当前JSP页面自己,有点像类中的this指针,它是Java.long.Object类的实例
经常使用方法(Object类的方法):
经常使用方法:
异常对象,当一个页面在运行过程当中发生了异常,就产生这个对象。若是一个JSP页面要应用此对象,就必须把isErrorPage设置为true,不然没法编译。它其实是java.lang.Throwable的对象
经常使用方法:
须要处理异常的页面,页面头要加上errorPage
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="exception.jsp" %>
Exception页面要在page中填写isErrorPage
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
在Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(经过属性名和属性值构成)以及服务器的有关信息(经过传递一个ServletContext对象)
经常使用方法以下:
就是符合某种特定的规范的Java类。使用Javabeans的好处是解决代码重复编写,减小代码冗余,功能区分明确,提升了代码的维护性。
Javabean 设计原则举例
//设计学生类 public class Students // 公有类 { private String name; //属性私有 private int age; //属性私有 public Students() //无参的公有构造方法 {} // getter 和 setter 方法 public void setName(String name){this.name =name;} public String getName(){return this.name} public void setAge(int age){this.age = age;} public int getAge(){return this.age;} }
JSP动做元素(acion elements)为请求处理阶段提供信息。动做元素遵循XML元素的语法,有一个包含元素名的开始标签,能够有属性、可选内容、与开始标签匹配的结束标签。
<body> <% Users user = new Users(); user.setUsername("admin");//设置用户名 user.setPassword("123456"); //设置密码 %> <h1>使用普通方式建立javabean实例</h1> <hr> 用户名:<%=user.getUsername()%><br> 密码:<%=user.getPassword()%><br> </body>
useBeans动做 setProperty动做 getProperty动做
<jsp:useBeans>
做用:在jsp页面中实例化或者在指定范围内使用javabean:
<jsp:useBean id="标识符" class="java类名(包括包名.类名)" scope="做用范围"/>
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/> <h1>使用useBean动做建立javabean实例</h1> <hr> 用户名:<%=myUsers.getUsername()%><br> 密码:<%=myUsers.getPassword()%><br>
做用:给已经实例化的JavaBean对象的属性复制,一共有四种形式
<jsp:setProperty name=“JavaBean实例名” property = “*” /> (与表单关联)
<jsp:setProperty name=“JavaBean实例名” property = “JavaBean属性名” /> (与表单关联)
<jsp:setProperty name=“JavaBean实例名” property = “JavaBean属性名” value=BeanValue“” /> (手工设置)
<jsp:setProperty name=“JavaBean实例名” property = “propertyName” param=“request对象中的参数名” /> (与request参数关联)
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/> <h1>setProperty动做元素</h1> <hr> <!-- 根据表单自动匹配全部的属性 --> <%-- <jsp:setProperty name="myUsers" property="*"/> --%> <!-- 根据表单自动匹配部分的属性 --> <%-- <jsp:setProperty name="myUsers" property="username"/> --%> <!-- 跟表单无关,经过手动复制给属性(意味着表单填写的无任何效果) --> <%-- <jsp:setProperty name="myUsers" property="username" value="xiaoshan"/> <jsp:setProperty name="myUsers" property="password" value="520"/> --%> <jsp:setProperty name="myUsers" property="password" param="mypass"/> 用户名:<%=myUsers.getUsername()%><br> 密码:<%=myUsers.getPassword()%><br>
第四种:form提交的action中设置了mypass参数
<form name="loginFrom" action="dologin.jsp?mypass=520" method="post">
做用:获取指定JavaBean对象的属性值
<jsp:getProperty name=“JavaBean实例名“ property=“属性名”/>
<!-- 使用传统表达式的方式获取用户名和密码 --> 用户名:<%=myUsers.getUsername()%><br> 密码:<%=myUsers.getPassword()%><br> <!-- 使用 getProperty 方式获取 --> 用户名:<jsp:getProperty name="myUsers" property="username"/><br> 密码:<jsp:getProperty name="myUsers" property="password"/><br>
说明:使用useBeans 的scope属性能够用来指定JavaBean的做用范围
做用域 | 描述 |
---|---|
存储在application对象中的属性 | 能够被同一个WEB应用程序中的全部Servlet和JSP页面访问 |
存储在session对象中的属性 | 能够被属于同一个会话(浏览器打开直到关闭称为一次会话,且在此期间会话不失效)的全部Servlet和JSP页面访问 |
存储在request对象中的属性 | 能够被属于同一个请求的全部Servlet和JSP页面访问(在有转发的状况下能够跨页面获取属性值),例如使用PageContext.forward和PageContext.include方法链接起来的多个Servlet和JSP页面 |
存储在pageContext对象中的属性 | 仅能够被当前JSP页面的当前响应过程当中调用的各个组件访问,例如,正在响应当前请求的JSP页面和它调用的各个自定义标签类 |
<h1>JavaBean四个做用域范围</h1> <hr> <jsp:useBean id="myUsers" class="com.po.Users" scope="request"/> <!-- 使用 getProperty 方式获取 --> 用户名:<jsp:getProperty name="myUsers" property="username"/><br> 密码:<jsp:getProperty name="myUsers" property="password"/><br> <!-- 使用 内置对象application方式获取 --> <%-- 用户名:<%=((Users)application.getAttribute("myUsers")).getUsername()%>><br> 密码:<%=((Users)application.getAttribute("myUsers")).getPassword()%>><br> --%> <!-- 使用 内置对象方式session获取 --> <%-- 用户名:<%=((Users)application.getAttribute("myUsers")).getUsername()%>><br> 密码:<%=((Users)application.getAttribute("myUsers")).getPassword()%>><br> --%> 用户名:<%=((Users)request.getAttribute("myUsers")).getUsername()%>><br> 密码:<%=((Users)request.getAttribute("myUsers")).getPassword()%>><br>
request 经过请求转发还能够获取到,可是page在其余页面没法获取到
Model 1模型出现前,整个Web应用的状况:几乎所有由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应。
弊端:在界面层充斥着大量的业务逻辑的代码和数据访问层的代码,Web程序的可扩展性和可维护性很是差。
JavaBean的出现可使JSP页面中使用JavaBean封装的数据或者调用JavaBean的业务逻辑代码,这样大大提高了程序的可维护性
Model1简单来讲就是JSP+JavaBean的开发模式
![]()
无状态:浏览器发送请求给服务器的时候,服务器响应客户端请求。可是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个服务器。
简单地说,就是服务器不会记录你,就是无状态协议
中文名:“小甜饼”
Web服务器保存在客户端的一系列文本信息
典型应用一:断定注册用户是否已经登陆网址 (如十天内免登陆…)
典型应用二:“购物车的处理”
安全风险:容易泄漏用户信息
建立Cookie对象:
Cookie newCookie = new Cookie(String key, Object value);
写入Cookie对象:
response.addCookie(newCookie)
读取Cookie对象:
Cookie[] cookies = request.getCookies();
Cookie经常使用方法:
方法名称 | 说明 |
---|---|
void setMaxAge(int expiry) | 设置cookie的有效期,以秒为单位 |
void setValue(String value) | 在cookie 建立后,对cookie进行赋值 |
String getName() | 获取cookie名称 |
String getValue() | 获取cookie的值 |
int getMaxAge() | 获取cookie的有效时间,以秒为单位 |
session | cookie |
---|---|
服务器端(内存)保存用户信息 | 客户端(文本文件)保存用户信息 |
session中保存的是Object类型 | cookie 保存的是String类型 |
随会话的结束而将其存储的数据销毁 | cookie能够长期保存在客户端 |
保存重要的信息 | 保存不重要的用户信息 |
安全性 :session 比 cookie要高
语法:
<%@ include file=“URL”%>
语法:
<jsp:include page=“URL” flush=“true|false”/>
经常使用page和flush:
page:要包含的页面
flush: 被包含的页面是否从缓冲区读取
include 指令 | jsp:include 动做 | |
---|---|---|
语法格式 | <%@ include file= “…” %> | <jsp:include page=“…” > |
发生做用的时间 | 页面转换期间 | 请求期间 |
包含的内容 | 文件的实际内容(代码) | 页面的输出(结果) |
转换成的Servlet | 主页面和包含页面转换成一个Servlet | 主页面和包含页面转换为独立的Servlet |
编译时间 | 较慢——资源必须被解析 | 较快 |
执行时间 | 稍快 | 较慢——每次资源必须被解析 |
语法:
<jsp:forward page=“URL”/>
等同:
request.getRequestDispatcher(“/url”).forward(request, response);
语法:
<jsp:param name=“URL” value=“”/>
经常做为<jsp:forward>的子标签
案例:
<jsp:forward page="user.jsp"/> <jsp:param value="admin@123.net" name="email"/> <jsp:param value="123456" name="password"/> //修改密码 </jsp:forward>
JSP 对象 | 怎么得到 |
---|---|
out | resp.getWriter |
request | servlet 方法的 req参数 |
response | servlet 方法的 resp参数 |
session | req.getSession() 函数 |
application | getServletContext() 函数 |
exception | Throwable |
page | this |
pageContext | PageContext |
config | getServletConfig() |