JSP学习笔记
《JAVA遇见HTML——JSP篇》学习笔记(上)
1.Java Web 简介
访问Web应用程序需要两个条件:1.联网 2.浏览器
软件开发领域三大方向:1.桌面应用程序 2.Web应用程序 3.嵌入式应用程序(安卓等)
静态网页:HTML+CSS,不会更新
动态网页:动态显示(可以与用户交互),HTML+CSS+数据库+高级语言(Java,C#,PHP),JavaScript,XML等,主流动态网页脚本技术:(JSP/ASP.net/PHP)
安装Tomcat
Apache是web服务器,本身只支持html即普通网页,只支持静态网页。
Tomcat是运行在Apache上的应用服务器,应用程序服务器提供的是客户端应用程序可以调用的方法。它只是一个servlet(jsp也翻译成servlet)容器,可以认为是Apache的扩展,但是可以独立于apache运行。
Tomcat服务器的目录结构:
/bin startup.bat可以启动服务器。shupdown.bat关闭服务器
/conf 配置文件
/lib 服务器所需各种JAR文件
/logs 日志文件
/temp 临时文件
/webapps 当发布Web应用时,默认会将Web应用的文件发布到此目录中
/work Tomcat把由JSP生成的Servlet放于此目录下
Tomcat默认端口号是8080,在conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
可以修改port来修改端口号
手工编写一个JavaWeb程序
在WebApps里创建一个文件夹myhome
在myhome里创建index.jsp 和文件夹WEB-INF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My first JSP page</title> </head> <body> <h1>Hello</h1> </body> </html>
WEB-INF中创建web.xml(复制examples),文件夹classes和lib
WEB-INF是Java的WEB应用的安全目录。安全是指客户端无法访问,只有服务端可以访问。
web.xml,项目部署文件。classes文件夹,用于放置*.class文件。lib用于放置所需要的jar包。
【没找到chrome修改页面编码的方式……只能暂时用英文……
访问:http://localhost:8080/myhome/index.jsp 即可
在web.xml中加上
<welcome-file-list>
<welcome-file>/default.jsp</welcome-file>
</welcome-file-list>
可以修改默认页面,修改xml文件后需要重启服务器。
MyEclipse
这个是收费的Orz 集成很多插件
配置JDK 配置Tomcat 在MyEclipse可以启动服务器。【如果之前启动了,会出现错误,记得先关闭服务器再在MyEclipse中启动、、
在MyEclipse中新建JavaWEB项目,在index.jsp修改默认页面代码。。
MyEclipse项目目录结构
项目路径默认是项目名。在MyEclipse中可以修改。其实修改了webapps中项目名
2.JSP基础语法
JSP,Java Server Pages,基于Java平台,安全性高,适合大型网站,企业级的WEB的应用程序。常见动态网站开发技术:Jsp Asp.net Php
JSP指令:
page指令,常位于jsp页面顶端
<%@ page 属性1="属性值" 属性2="属性值" ... %>
常用属性:language,指定JSP页面使用的脚本语言,默认为java
import,引用脚本语言使用的类文件
contentType,用来指定页面所采用的编码方式,默认为text/html,ISO-8859-1(纯英文字符集,使用中文会报错。)
<%@ page language="java" import="java.util.*" contentType="text/html; charaset=utf-8 %>
pageEncoding 是jsp 文件本身的编码 contentType 的charset是指服务器发给客户端时的内容编码,contentType更常用。
include指令,将一个外部文件嵌入到当前JSP文件中,同时解析这个页面的JSP语句
taglib指令,使用标签库定义新的自定义标签,在JSP页面中启动定制行为
JSP注释
1.HTML注释 <!--html注释--> //客户端可见
2.JSP注释 <%--jsp注释--%> //客户端不可见
3.jsp脚本注释 //单行注释 /*多行注释*/ //客户端不可见
可见不可见是指在客户端页面查看源代码时候是否可见。
JSP脚本
<% JSP脚本 %>
<%! java声明,变量,函数等 %>
<%!String s="hello"%>
<%= 表达式,注意表达式不以分号结束 %>
<%=s%>
JSP页面生命周期
每一个用户请求对应一个线程。
jsp打印九九乘法表(表达式&脚本):
<body> <%! String printMultiTable() { String s = ""; for (int i = 1; i <= 9; ++i) { for (int j = 1; j <= i; ++j) { s += i + "*" + j + "=" + (i*j) + " "; } s += "<br>"; } return s; } void printMultiTable2(JspWriter out) throws Exception { for (int i = 1; i <= 9; ++i) { for (int j = 1; j <= i; ++j) { out.print(i + "*" + j + "=" + (i*j) + " "); } out.println("<br>"); } } %> <h1>九九乘法表</h1> <hr> <%= printMultiTable() %> <% printMultiTable2(out); %> </body>
3.JSP内置对象
JSP九大内置对象:out request response session application page pageContext exception exception config
Web程序基于请求(request)相应(response)模式
缓冲区:内存中用来保存临时数据的区域
out对象:JspWriter类的实例,
常用方法:
void println()
void clear() 清除缓冲区内容,如果在flush之后调用会抛出异常
void clearBuffer() 清除缓冲区内容,如果在flush之后调用不会抛出异常
void flush() 将缓冲区内容输出到客户端
int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
int getRemaining() 返回缓冲区还有多少可用
boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
void close() 关闭输出流
jsp表单处理
常用提交方式有GET和POST
<form name="表单名" action="动作" mehtod="提交方式"> </from>
get:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2kb。安全性比较低但效率比post方式高。适合提交数据量不大,安全性不高的数据。比如:搜索、查询等功能。
post:将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高的用户信息。比如:注册、修改、上传等功能。
<form name="loginForm" action="dologin.jsp" method="get"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username" /></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password"/></td> </tr> <tr> <td colspan="2"><input type="submit" value="登录"></td> </tr> </table> </form>
在dologin的页面url为:..../dologin.jsp?username=hh&password=aa 会泄露个人信息。
提交方式改为post之后,url将不再显示用户信息。
request对象:HttpServletRequest类的实例
客户端的请求信息被封装在request对象中。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
常用方法:
String getParameter(String name) 返回name指定的参数的参数值
String[] getParameterValues(String name) 返回包含参数name的所有值的数组
<body> <h1>用户注册</h1> <hr> <form name="regForm" action="request.jsp" method="post"> <table> <tr> <td>用户名</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>爱好: </td> <td> <input type="checkbox" name="favourite" value="read">读书 <input type="checkbox" name="favourite" value="music">音乐 <input type="checkbox" name="favourite" value="movie">电影 <input type="checkbox" name="favourite" value="internet">上网 </td> </tr> <tr><td colspan="2"><input type="submit" value="登录"/></td> </tr> </table> </form> </body>
<body> <% request.setCharacterEncoding("utf-8"); %> <h1>request内置对象</h1> <hr> 用户名:<%=request.getParameter("username")%><br> 爱好:<% String[] favourites = request.getParameterValues("favourite"); for(int i = 0; i < favourites.length; i++) { out.println(favourites[i] + " "); } %> </body>
接受表单数据的页面要和传递表单的页面编码方式一致: request.setCharacterEncoding("utf-8");
如果通过URL传递中文防止乱码则需要修改Tomcat的配置文件:
conf/server.xml中的Connection中加: URIEncoding="utf-8" 修改配置文件需要重启服务器。【窝没改也可以呢~
response对象:HttpServletResponse类的实例
response具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次的访问有效,其他页面的response对象对当前页面无效。
String getCharacterEncoding() 返回响应用的是哪种字符编码
void setContentType(String type) 设置响应的MIME类型(MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。)
PrintWriter getWriter() 返回可以向客户端输出字符的一个对象。response得到的PrintWriter的输出提前于内置的out对象
sendRedirect(String location) 重定向客户端的请求
请求转发和请求重定向的区别
请求转发:服务器行为,requset.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变
请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会被保存,地址栏的URL地址会改变
<%@ page language="java" import="java.util.*, java.io.*" contentType="text/html; charset=utf-8"%> <% response.setContentType("text/html; charset=utf-8"); out.println("<h1>response内置对象</h1>"); out.println("<hr>"); //out.flush(); PrintWriter outer = response.getWriter(); outer.print("response对象生成的输出流outer对象"); // 请求重定向 //response.sendRedirect("register.jsp"); //response.sendRedirect("request.jsp"); // 请求转发 request.getRequestDispatcher("request.jsp").forward(request, response); %>
session对象:HttpSession类的实例
session表示客户端与服务器的一次会话。生命周期:用户从进入网站到关闭浏览器的这段时间。
服务内存保存着不同用户的session。
当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器通过session知道是同一个客户。
session对象的常用方法有:
long getCreationTime() : 返回session的创建时间;
public String getId() : 返回session的唯一ID号(该ID在session生成时,由JSP引擎创建)
public Object setAttribute(String name,Object value) : 按照键值对的方式在该session会话中保存一个属性(该属性是一个对象类型)
public Object getAttribute(String name) : 返回指定名称的属性的值(如果该名称的属性不存在,则返回null)
String[] getValueNames() : 返回一个(包含在此session中所有可用属性)的数组。
int getMaxInactiveInterval() : 返回一个时间,该时间表示当前session间隔多少时间之后会失效(单位:秒)。
Session生命周期:
创建:创建一个SessionId。 通过超链接打开的是同一次会话
活动:创建新的会话不代旧的会话结束,除非过期
销毁:1.session.invalidate() 2.超时 3.服务器重启
设置session超时的两种方法:
1.session.setMaxInactiveInterval(时间);//单位秒
2.WebRoot/WEB-INF/web.xml配置
<session-config>
<session-timeout>
10 单位是分钟
</session-timeout>
</session-config>
application对象:ServletContext类的实例
开始于服务器启动,终止于服务器关闭。
application对象常用方法:
1、public void setAttribute(String name, Object value)使用指定名称将对象绑定到此会话。
2、public Object getAttribute(String name) 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则放回null。
3、Enumeration getAttributeNames()返回所有可用属性名的枚举
4、String getServerInfo()返回JSP(servlet)引擎名及版本号
page对象,指向本JSP页面,类似this指针
page.toString();
pageContext对象:javax.servlet.jsp.PageContext类的实例对象
pageContext对象的常用方法: (1)JspWriter getOut() 返回当前客户端相应被使用的JspWriter流(out) (2)HttpSession getSession() 返回当前页面中HttpSession对象(session) (3)Object getPage() 返回当前页面的Object对象(page) (4)ServletRequest getRequest() 返回当前面的ServletRequest对象(request) (5)servletResponse getResponse() 返回当前页的ServletResponse对象(response) (6)void setAttribute(Strign name, Object attribute) 设置属性及属性值 (7)Object getAttribute(String name ,int scope) 在指定范围内取属性值 (8)int getAttributeScope(String name) 返回某属性的作用范围 (9)void forward(String relativeUrlPath) 使当前页面跳转到另外一个页面(服务器转发) (10)void include(String relativeUrlPath) 在当前位置包含另一个文件
Config对象
exception对象:Java.lang.Throwable类的实例
如果一个jsp页面要用到此对象,就必须把isErrorPage设为true,否则无法编译。
Exception对象常用方法: (1)String getMessage() 返回描述异常的信息 (2)String toString() 返回关于异常的简短描述信息 (3)void printStackTrace() 显示异常及其栈轨迹 (4)Throwable FillInStackTrace() 重写异常的执行栈轨迹
出错时转到错误页面 <%@ page errorPage="exception.jsp" %>
设置该页面为错误页面 <%@ page isErrorPage="true" %>
阶段案例:用户登录
<body>
<form action="dologin.jsp" method="post">
<p>
<label>用户名:</label>
<input name="username" value="" />
<label>密码:</label>
<input type="password" name="password" value="" />
</p>
<p>
<input type="submit" value="登录" class="login" style="cursor: pointer;">
</p>
</form>
</body>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; String username=""; String password=""; request.setCharacterEncoding("utf-8"); username = request.getParameter("username"); password = request.getParameter("password"); if ("admin".equals(username) && "admin".equals(password)) { session.setAttribute("username", username); request.getRequestDispatcher("login_success.jsp").forward(request, response); } else { response.sendRedirect("login_failure.jsp"); } %>
<body> <% String user = ""; if (session.getAttribute("username") != null) { user = session.getAttribute("username").toString(); } %> <h1>欢迎您。 <font color="red"> <%= user %> </font> </h1> </body>
<body> <h1>登录失败请检查用户名或密码</h1> <a href="login.jsp">返回登录</a> </body>