2.5、跳转指令
本次预计讲解的知识点
1、 跳转指令的使用形式;
2、 跳转的特点。
具体内容
从一个JSP页面可以跳转到另外一个JSP或其它页面。跳转指令依然属于标签指令形式,
所以在跳转指令操作完成后依然要进行标签完结,对于跳转指令有以下两种定义形式:
· 定义一:不向跳转页面传递参数:
|- <jsp:forward page="路径"/>
· 定义二:向跳转页面传递参数:
<jsp:forward page="路径">
<jsp:param name="参数名称" value="参数内容"/>
<jsp:param name="参数名称" value="参数内容"/>
<jsp:param name="参数名称" value="参数内容"/>
... </jsp:forward>
范例:实现跳转
<%@ page pageEncoding="UTF-8"%>
<h1>HELLO FORWARD</h1>
<%
String str = "WORLD" ;
%>
<%--<jsp:forward page="param.jsp"/>--%>
<jsp:forward page="param.jsp">
<jsp:param name="paramA" value="HELLO"/>
<jsp:param name="paramB" value="<%=str%>"/>
</jsp:forward>
以上的代码执行之后有一个特点:跳转之后地址栏不会发生任何的改变,但是页面的内
容发生了改变,那么这样的跳转我们称为服务器端跳转。当然,与服务器端跳转还有一种对应
的形式:客户端跳转。
<script type="text/javascript">
window.location = "param.jsp" ;
</script>
以上的操作与直接编写超链接区别不大,跳转之后地址栏上会发生地址的改变,也就是
说变为了跳转的目标页面路径,所以这样的跳转称为客户端跳转。
结论:
地址栏不改变的跳转称为服务器端跳转;
地址栏改变的跳转称为客户端跳转。
总结
1、 跳转指令与包含指令一样都必须在每次使用后完结;
2、 forward跳转之后地址栏不改变,属于服务器端跳转。
2.6、MyEclipse开发工具
本次预计讲解的知识点
以后主要使用的就是MyEclipse。
具体内容
Eclipse本身只提供有Java的开发环境,而后来如果要想开发Java EE程序,需要使用一系列
的插件。所以后来由IBM开发出了一个MyEclipse的插件(收费),从此Java EE的开发就变得非常容易了,而慢慢的MyEclipse使用人群也越来越多了。 但是后来随着发展,MyEclipse开始形成一个独立的产品,也就是说如果你自己直接安装的话,那么安装的MyEclipse里面就集成有了Eclipse。 本次使用的版本是MyEclipse 2015(在学习到Spring之前根本感觉到它与2014的区别)。 MyEclipse 2015要比MyEclipse 2014麻烦,主要麻烦在配置服务器上。如果是MyEclipse 2014,直接打开配置中心就可以配置服务器了,但是2015不行。
1、 建立一个新的WEB项目;
2、 在你编写代码之前首先要进行服务器的配置;
此时会继续将项目部署到Tomcat之上,部署的目录就是TomcatHOME/webapps。
再来一个“publish”发布到Tomcat上。
默认情况下如果要访问虚拟目录(可能是自动部署也可能是手工部署),那么出现的一定是
一个目录的列表,但是如果你的项目里面配置了欢迎页。就会自动显示欢迎页,
在WEB-INF/web.xml文件里面有欢迎页面的配置。
<welcome-file-list>
<welcome-file>MyJsp.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
总结
基本认知:工具是建立在你代码已经非常熟练的基础之上使用的。
2.7、综合实战:用户登录
用户在登录表单上输入登录信息,主要是输入用户名和密码信息,而后提交到一个指定的
jsp页面,在这个页面上进行用户名和密码的检查,如果通过检查,表示合法用户,则跳转
到欢迎页上进行欢迎信息的显示,如果出现了错误,则跳转回登录页。并且显示错误提示
信息。
需要准备出数据表以及相关的测试数据,才可以实现登录验证。
表名称为member表,如果要想进行验证最简单的做法可以使用如下结构的SQL语句:
SELECT COUNT(mid) FROM member WHERE mid=? AND password=?
· 输入正确的用户名和密码:数据量的统计为1;
· 输入错误的用户名或密码:数据量的统计为0;
一共需要建立三个页面:login.jsp、check.jsp、welcome.jsp。
1、 用户通过login.jsp进行信息的输入;
2、 表单提交给check.jsp页面,进行检查,如果登录失败,则跳转回login.jsp页面,
并且显示错误提示信息;
3、 如果登录成功,跳转到welcome.jsp页面;
以上的基础数据库验证完成之后为了保证程序可以正常编写,还需要在login.jsp页面中
加入JavaScript的验证。建立一个login.js文件;
总结
只要是系统开发,数据的检查就会分为两个部分:
· 服务器的验证:由JSP文件负责验证;
· 客户端验证:由JavaScript完成;
因为很多时候由于客户端的限制,有可能JavaScript验证会失效,所以任何的健壮的系统
都一定要分两个地方进行验证。
第三章、JSP四种属性范围
3.1、内置对象概览
如果说在Java程序里面给了你一个类,那么很明显用户需要自己明确的进行对象的创建,而所谓的内置对象指的是不需要用户自己创建的对象(不需要用户自己手工进行对象实例化),而是由WEB容器在它启动时默认创建好的对象,用户可以直接拿来使用,像之前使用的“request.getParameter()”中的request就表示是一个内置对象。
No. 对象名称 类型 描述
1 pageContext javax.servlet.jsp.PageContext 指的是页面上下文操作
2 request javax.servlet.http.HttpServletRequest 服务器端接收客户端请求内容
3 response javax.servlet.http.HttpServletResponse 服务器端回应客户端的请求操作
4 session javax.servlet.http.HttpSession 描述每一个用户的信息
5 application javax.servlet.ServletContext 描述整个当前项目的上下文
6 config javax.servlet.ServletConfig 取得默认的配置信息
7 out javax.servlet.jsp.JspWriter 进行输出,一般不用
8 page java.lang.Object 每一个页面都属于Object子类,一般不用
9 exception java.lang.Throwable 默认情况下,所有的异常都可以由容器处理
如果要想学习好JSP开发,那么必须把以上的内置对象全部记住。
总结
1、 记住九个内置对象名字以及对应类型;
2、 一定要慢慢开始学会查阅Java EE文档。
3.2、四种属性范围
四种属性范围是整个Java WEB的核心概念所在,可以这么说,如果你不清楚四种属性范围,
那么就无法去更好的理解MVC,也无法进行有效的程序开发,更不可能去理解后面的
Struts、Spring MVC等概念。
基本概念
在任何一个WEB项目里面都一定会存在有多个页面,那么如果说一个对象现在需要跨越
多个页面依然可以使用,那么这一点称为属性的保存范围,而在JSP里面对于属性的操作
提供有如下的三个方法:
· 设置属性:public void setAttribute(String name,Object value);
· 取得属性:public Object getAttribute(String name);
· 删除属性:public void removeAttribute(String name)。
属性的名字一定是String型的,而且不允许重复(重复就是覆盖),而保存的value是
Object型,意味着可以保存所有的Java类型。
在JSP里面一共有四个对象具备以上的三个方法:pageContext、request、session、
application。
3.3、page范围(pageContext)
某一个对象只能够在当前的JSP页面中使用,但是page属性范围并不能够使用page对象操作,只能够依靠pageContext对象完成。 范例:观察属性范围
<%@ page pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <% // 设置属性 pageContext.setAttribute("name","MLDN") ; pageContext.setAttribute("birthday",new Date()) ; %> <% // 取得属性 String tname = (String) pageContext.getAttribute("name") ; Date tbirthday = (Date) pageContext.getAttribute("birthday") ; %> <h1>姓名:<%=tname%></h1> <h1>生日:<%=tbirthday%></h1>
|
随后要发生一个跳转操作。
范例:第一个页面设置属性,随后跳转到第二个页面
<%@ page pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <% // 设置属性 pageContext.setAttribute("name","MLDN") ; pageContext.setAttribute("birthday",new Date()) ; %> <jsp:forward page="scope_b.jsp"/>
|
范例:第二个页面取得属性
<%@ page pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <% // 取得属性 String tname = (String) pageContext.getAttribute("name") ; Date tbirthday = (Date) pageContext.getAttribute("birthday") ; %> <h1>scope_b,姓名:<%=tname%></h1> <h1>scope_b,生日:<%=tbirthday%></h1>
|
一旦发生了跳转之后,在一个页面上所设置的属性将不会继续保留到其它页面。
3.4、request范围
如果说现在希望执行了服务器端跳转后依然可以取得设置的属性内容,则可以采用request属性范围。 范例:设置属性
<%@ page pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <% // 设置属性 request.setAttribute("name","MLDN") ; request.setAttribute("birthday",new Date()) ; %> <jsp:forward page="scope_b.jsp"/>
|
范例:取得属性
<%@ page pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <% // 取得属性 String tname = (String) request.getAttribute("name") ; Date tbirthday = (Date) request.getAttribute("birthday") ; %> <h1>scope_b,姓名:<%=tname%></h1> <h1>scope_b,生日:<%=tbirthday%></h1>
|
只要是服务器端跳转,那么request属性就可以一直被保留下来。
范例:使用客户端跳转
<%@ page pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <% // 设置属性 request.setAttribute("name","MLDN") ; request.setAttribute("birthday",new Date()) ; %> <a href="scope_b.jsp">跳转</a>
|
超链接的操作特点是跳转后地址栏发生了改变。
最重要的结论: 服务器端跳转与客户端跳转的最大使用区别:服务器端跳转可以传递request属性,而客户端跳转不能够传递request属性。
4.2、request内置对象(乱码解决)
在之前曾经发现过,如果在表单里面输入中文,那么有可能提交后就会变为中文乱码。
范例:输入表单
<meta charset="UTF-8">
<form action="input.jsp" method="post">
请输入内容:<input type="text" name="msg" id="msg">
<input type="submit" value="提交">
</form>
范例:取得输入内容
<%@ page pageEncoding="UTF-8"%>
<%
String str = request.getParameter("msg") ;
%>
<h1>输入内容:<%=str%></h1>
实际上针对于乱码解决需要考虑两种情况:
· POST提交请求(表单上使用):可以直接使用ServletRequest父接口定义的方法:
|- 统一请求编码:public void setCharacterEncoding(String env) throws UnsupportedEncodingException;
· GET提交请求(直接输入访问路径、表单):
|- 如果使用了GET请求,那么所有的编码方式就使用的是ISO8859-1编码,
所以在接收之后需要进行编码的转换:String str = new String(request.getParameter("msg").getBytes("ISO8859-1")) ;
在HttpServletRequest接口里面有一个方法,此方法可以判断出当前的请求模式:
· 取得请求模式:public String getMethod();
范例:解决post请求编码
<%@ page pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8") ;
String str = request.getParameter("msg") ;
%>
<h1>输入内容:<%=str%></h1>
总结:关于POST与GET请求的区别?
· POST请求主要用在表单上,处理路径只是提交路径不会改变;
· 只要是用户直接进行页面访问,那么请求类型一定就是GET请求,表单上也可以使用
GET请求,但是GET请求有一个问题,它会将所有的请求参数都附加到表单访问路径上,
所以不能够传递过多的内容,一般只能够传递4K ~ 5K。