Scriptlet是指一个有效的程序段,这个程序段可以包含多个JSP语句、方法、变量和表达式。
使用Scriptlet,可以做以下的事:
1. 声明将要用到的变量或方法
2. 编写JSP表达式
3. 使用任何隐含的对象和任何用
使用scriptlet,要注意以下几个方面的问题:
1. 在编写JSP语句时,如果你使用JAVA语言,这些语句必须遵从JAVA语言规范
2. 任何文本,HTML标记,JSP元素必须在Scriptlet之外
3. 当JSP收到客户的请求时,Scriptlet就会被执行,如果Scriptlet有显示内容,这些显示的内容就被存在out对象中
Scriptlet的基本语法格式如下:
<% 代码体(code fragment)%>
这个格式和表达式的格式有些像,注意。
Java Servlet是一个Java类,是运行在请求/响应模式的服务器上的模块.
Servlet都是由HttpServlet继承下来的,可以说是在服务器上运行的Applet,其基本结构如下代码所示:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SomeServlet extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{
//用“request”可以读取输入的值(e.g.cookies)和表单提交的数据
//用“response”返回输出的内容
PrintWriter out=response.getWriter*();
//用“out”向浏览器写内容
}
}
1. 当抛出异常时,有几件事会随之发生.首先要像创建其它JAVA对像那样,创建一个异常对象.然后,停下来当前的执行路径,再将异常对角的reference从当前运行环境中弹出去。现在异常处理机制开始接管程序了,它会去找到一个合适的地方来继续执行这个程序。这个地方就是“异常处理程序(exception handler)“,其功能就是将程序从问题中恢复过来,于是程序或者是尝试把关换一务运行路径,或者是继续运行下去。
2. 如:if(t==null) throw new NullPointerException();
3. 异常的参数——所有的标准异常都有两个构造函数:第一个是默认的构造函数,第二个是要拿一个字符串当参数的,因此你可以在异常中放入一些相关的信息:
throw new NullPointerException(“t=null”);
将来这个字符串可以用各种方法提取出来。
4. try{
//Code that might generate exceptions
}catch(Type1 id1){
//Handle exceptions of Type1
}catch(Type2 id2){
//Handle exceptions of Type2
}
//etc…
5. 要想创建你自己的异常,你必须继承已有的异常,最好是意思上同你要创建的那个新异常比较相近。创建一个新的异常类的最简单的做法是直接让编译器为你生成一个默认的构造函数,这样做几乎不需要写任何代码:(F:/勉強/JAVA/JAVABOOK/CHAR9.PDF P5)
如果你是让一个编辑控件不能输入数字以外的字符,则可以:
var
dwStyle: DWORD;
...
// 假设你的编辑控件叫 edtEdit
dwStyle := GetWindowLong(edtEdit.Handle, GWL_STYLE);
dwStyle := dwStyle or ES_NUMBER;
SetWindowLong(edtEdit.Handle, GWL_STYLE, dwStyle);
// 搞定
(飞思科技产品研发中心,《JSP应用开发详解》,电子工业出版社,2003-5,P76)
1. Include指令
语法:
or
2. Forward指令
JSP语法:
or
3. UseBean指令
4. GetProperty指令
这个属性获取Bean的属性的值并将之转化为一个字符串,名后将其插入到输出的页面中.
语法:
5. SetProperty指令
基本语法:
6. 把字符串转化为其它类型的方法
Property类型 |
方法 |
boolean |
java.lang.Boolean.valueOf(String).booleanValue() |
Boolean |
Java.lang.Boolean.valueOf(String) |
Byte |
Java.lang.Byte.valueOf(String).byteValue() |
Byet |
java.lang.Byte.valueOf(String) |
char |
java.lang.Character.valueOf(String).charValue() |
Character |
java.Character.valueOf(String).charValue() |
Double |
java.lang.Double.valueOf(String).doubleValue() |
int |
java.lang.Integer.valueOf(String).intValue() |
Integer |
Java.lang.Integer.valueOf(String) |
… …
|
|
7. Plugin指令
执行一个Applet或Bean,有可能的话还要下载一个Java插件用于执行它。
7.1. 处理汉字信息
当用request对象获取客户提交的汉字字符时,会出现乱码问题,所以对含有汉字字符的信息必须进行特殊的处理方式。首选项,将获取的字符串用ISO-8859-1进行编码,并将编码存放到一个字节数组中,然后再将这个数组转化为字符串对象即可。如下列所示: String str=request.getParameter(“girl”);
Byte b[]=str.getBytes(“ISO-8859-1”);
str=new String(b);
通过上述过程,提交的任何信息(无论是汉字字符或西欧字符)都能正确地显示。
(实验不通过)
7.2. 常用方法举例
6. getProtocol() 获取客户向服务器提交信息所使用的通信协议,比如http/1.1
7. getServletPath() 获取客户请求的JSP页面文件的目录
8. getContentLength() 获取客户提交的整个信息长度
9. getMethod() 获取客户提交信息的方式,比如post或get
10. getHeader(String s) 获取HTTP头文件中由参数s指定的头名字的值
11. getHeaderNames() 获取头名字的一个枚举
12. getHeaders(String s) 获取头文件中指定头名字的全部值的一个枚举
13. getRemoteAddr() 获取客户的IP地址
14. getRemoteHost() 获取客户机的名称(如果获取不到,就获取IP地址)
15. getServerName() 获取服务器的名称
16. getServerPort() 获取服务器的端午号
17. getParamerterNames() 获取客户提交的信息体部分中name参数值的一个枚举
1. 文件头加上
<%@ page contentType=”text/html; charset=GBK”%>
或
<%@ page contentType=”text/html; charset=GB2312”%>
“语句”对象是发送/执行(常规)SQL语句,并通过相关“连接”检索结果的容件或传输机制。“连接界面控制的区域”中曾经介绍,语句类型有三种,包括Prepared Statements和Callable Statements,两者都是“语句”的子界面。如前所述,无需创建新的“语句”实例,而是请求相关的“连接”进行创建:
Statement stmt=con.createStatement();
Execute系列是“语句”方法最常使用的:
executeQuery()用来执行返回单个ResultSet的SQL语句。
executeUpdate()用来执行修改表或表中列值的SQL语句,并返回修改过的行数(在DDL语句中为零)
excecute()可用于执行任何类型的SQL语句,但更针对那些可以返回多个结果或值的SQL语句。
属性是Bran组件内部状态的抽象表示。javaBeans的属性可以分为以下四类:
l Simple简单的
l Indexed索引的
l Bound绑定的
l Constrained约束的
简单属性依赖于标准命名约定来定义getXXX()方法和setXXX()方法。
索引属性则允计读取和设置整个数组,也允许使用数组索引单独地读取和设置数组元素。
绑定属性则是其值发生变化时要广播给属性变化监听器的属性。
约束属性则是那些值发生改变及起作用之前,必须由约束属性变化监听生效的属性。
1、简单属性(Simple)
一个简单属性表示一个伴随有get/set方法的变量。基本上,采用通常所说的存取方法来设置和检索Bean的属性。即:
public void set
public
例如,对于“MyBean”属性,我们可以采用下面的方法:
public void setMyBean(MyBeanType value);
pulbic MyBeanType getMyBean();
对于布尔属性,我们使用下面的方法:
pubilc boolean inMyBooleanBean();
public void setMyBooleanBean(boolean value);
2、索引属性(Indexed)
一个Indexed索引属性表示一个数组值。同上所述的Simple简单属性一样,可以合用get/set方法取得数组中的值。
3、绑定属性(Bound)
绑定属性提供一种机制,即通知监听器一个JavaBeans组件的属性发生了改变。监听器实现了PropertyChangeListener接口并接收由JavaBeans组件产生的PropertyChangeEvent对象,PropertyChangeEvent对象包括一个属性名字,旧的属性值以及第一个监听器可能要访问的新属性值。
4、约束属性(Constrained)
约束属性和绑定属性类似,但是属性值的变化首先要被所有的监听器验证之后,值得变化才能由JavaBeans组件发生和用。一个JavaBeans的约束属性是指当这个属性的值要发生变化时,与这个属性已经建立了某种连接的其他Java对象可否决属性值的改变。任何一个监听器都可以否决属性变化,JavaBeans组件同意不使属性变化才能生效。
方法是处理事件的手段,而事件处理则是JavaBeans体系结构的核心之一。
JavaBeans容器环境可以接收JavaBeans组件事件通知,并且,如果JavaBeans组件符合一些简单规则,就可以在设计时选择JavaBeans组件可以响应的事件。在JavaBeans组件上加入和删除方法必须以标准方式定义,以便分别加入和删除事件监听器。JavaBeans容器能够加入或删除对事件监听器的引用,它使用允许容器与组件事件交互的JavaBeans组件。
为了能让使用这个beans的应用程序构建工具(比如JSP引擎)知道这个beans的属性和方法,只需在类的方法命名上遵守以下几点:
① 如果类的成员变量的名字是xxx,那么为了更改或获取成员变量的值,即更改或获取属性,在类中可以使用两个方法:
getXxx(),用来获取属性xxx。
setXxx(),用来修改属性xxx。
② 对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用is代替上面的get和set。
③ 类中方法的访问属性都必须是pubic的
④ 类中如果有构造方法,那么这个构造方法也是public的,并且是无参数的。
(耿祥义,张跃平,《JSP实用教程》,清华大学出版社,2004年11月,P184)
简明扼要地说,JSP是一种用来开发含有动态内容网页的技术。
简单地说,servlet是一段向服务器(通常是Web服务器)上加入新功能的代码。
1、 现在很少用table来定位了,table不是表示层的语言,现在一般用div+css来定位。后者可以较方便地改变界面设计,而前者,要改变界面风格,很难。
2、 table中最好不要嵌套form语句,一个jsp页面中,最好只有一个form语句, jsp中,除了id, name不可以改变以外,其它的属性都可以通过程序段来改变,所以,提交不同的submit,可以触发不同的action。
3、 table中嵌套form语句,虽然服务器不会报错,但代码会很不美观。
this.getServletContext().getRequestDispatcher("所要发送到的目的页面URL").forward(request, response);
13:jsp/servet重定向问题:
不改变url的:
1:)servlet:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
getServletContext().getRequestDispatcher(test2URL).forward(request, response);
2:)jsp
改变url的:
1:)response.sendRedirect("/web/mail/pop3.jsp");
Listing 1
//...
//initialize RequestDispatcher object; set forward to home page by default
RequestDispatcher rd = request.getRequestDispatcher("home.jsp");
//Prepare connection and statement
rs = stmt.executeQuery("select password from USER where userName = '" + userName + "'");
if (rs.next()) { //Query only returns 1 record in the result set; only 1
password per userName which is also the primary key
if (rs.getString("password").equals(password)) { //If valid password
session.setAttribute("User", userName); //Saves username string in the session object
}
else { //Password does not match, i.e., invalid user password
request.setAttribute("Error", "Invalid password.");
rd = request.getRequestDispatcher("login.jsp");
}
} //No record in the result set, i.e., invalid username
else {
request.setAttribute("Error", "Invalid user name.");
rd = request.getRequestDispatcher("login.jsp");
}
}
//As a controller, loginAction.jsp finally either forwards to "login.jsp" or "home.jsp"
rd.forward(request, response);
//...
In this and the rest of the accompanying sample Web applications, the security realm is assumed to be an RDBMS. However, this article's concept is transparent and applicable to any security realm.
1. type="text" name="input"
onpropertychange="if(isNaN(value))execCommand('undo')" />
此种方法只能输入数字和小数点,且像000000000000012454这样的数字也能给把前面的0都去掉。
头儿,我发现了一个很奇怪的现象,不知道是为什么。
首先,数据库保持连接,程序正常运行;
现在我把数据库暂停,然后运行要与数据库进行连接的程序,居然还能得到正确结果。
然后,我把数据库关了,程序的运行结果和预期一样跳到错误页面
现在我重启数据库,刷新了页面,程序居然还是会跳到错误页面,提示是数据库那里出了问题。
最后,我重新登录了我的程序,程序就能正常运行了。
<%@ page language="Java" contentType="text/html" %>
<%@ page import="com.ora.jsp.util.*" %>
<html>
<body bgcolor="white">
<form action="checkbox.jsp">
<input type="checkbox" name="fruits" value="Apple">Apple<br>
<input type="checkbox" name="fruits" value="Banana">Banana<br>
<input type="checkbox" name="fruits" value="Orange">Orange<br>
<input type="submit" value="Enter">
</form>
<%
String[] picked = request.getParameterValues("fruits"); //得到checkbox的值,是一个数组
if (picked != null && picked.length != 0) { //判断有选择
%>
You picked the following fruits: //输出选择的内容
<form>
<input type="checkbox" name="fruits" value="Apple"
<%= ArraySupport.contains(picked, "Apple")?"checked" : "" %> >Apple<br>
<input type="checkbox" name="fruits" value="Banana"
<%= ArraySupport.contains(picked,"Banana")?"checked":"" %> >Banana<br>
<input type="checkbox" name="fruits" value="Orange"
<%= ArraySupport.contains(picked,"Orange")?"checked" : "" %> >Orange<br>
</form>
<% } %>
</body>
</html>
通常,在一个设计良好的Web应用中,都会综合使用Servlet和JSP技术。Servlet控制业务流转,JSP则负责业务处理结果的显示。此时,将大量用到重定向技术。
重定向技术可以分为两类,一类是客户端重定向,一类是服务器端重定向。客户端重定向可以通过设置特定的HTTP头,或者写JavaScript脚本实现。本文主要探讨服务器端重定向技术的实现。
服务器端的重定向相关类
服务器端的重定向技术涉及到javax.servlet.ServletContext、javax.servlet.RequestDispatcher、javax.servlet.http.ServletRequest、javax.servlet.http.ServletResponse等几个接口。
服务器端的重定向方式
服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法。下面对这两种方式进行介绍。
HttpServletResponse.sendRedirect()方法
HttpServletResponse接口定义了可用于转向的sendRedirect()方法。代码如下:
public void sendRedirect(java.lang.String location)throws java.io.IOException |
这个方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect("http://java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。
RequestDispatcher.forward()方法
RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法,参见如下代码:
public interface RequestDispatcher { void forward(ServletRequest request, ServletResponse response); void include(ServletRequest request, ServletResponse response); } |
forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。 include()方法将把Request Dispatcher资源的输出包含到当前输出中。
注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。
如何得到RequestDispatcher
有三种方法可以得到Request Dispatcher对象。
1.javax.servlet. ServletRequest的getRequestDispatcher(String path)方法,其中path可以是相对路径,但不能越出当前Servlet上下文。如果path以“/”开头,则解析为相对于当前上下文的根。
2.javax.servlet. ServletContext的getRequestDispatcher(String path)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。可以调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,并可以转向到外部上下文的一个服务器资源链接。
3.使用javax.servlet. ServletContext的getNamedDispatcher(String name)得到名为name的一个Web资源,包括Servlet和JSP页面。这个资源的名字在Web应用部署描述文件web.xml中指定。
这三种方法的使用有细微的差别。比如,下面是一个应用的配置文件web.xml:
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
|
其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为org.javaresearch. redirecttest.ServletOne和org. javaresearch.redirecttest.ServletTwo。可以在浏览器中通过类似于下面的链接访问:
http://localhost:8080/servlet/firstservlet/
使用1中方法,例如在firstservlet可以写入下面的代码:
RequestDispatcher rd = request.getRequestDispatcher("secondservlet"); rd.forward(request, response); |
此时控制权将转向到第二个Servlet了。
使用2中的方法,可以从Servlet Context中得到RequestDispatcher代码如下:
RequestDispatcher rd = getServletContext().getRequest Dispatcher("/servlet/secondservlet"); rd.forward(request, response); |
使用3中的方法,从上面的web. xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:
RequestDispatcher rd = getServletContext().getNamedDispatcher("SecondServlet"); rd.forward(request, response); |
这样也可以重定向到SecondServlet了。
JSP页面中的重定向
JSP在解析后编译为一个Servlet运行,所以在JSP中也可以使用上面的重定向代码,并且,JSP还提供了更便利的操作,如下:
|
JSP页面执行到这儿,将终止当前的处理,将控制权交由nextpage.jsp。
如何选择
RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。
=48&&event.keyCode<=57" οnpaste="return !clipboardData.getData('text').match(//D/)" style="ime-mode:disabled" οndragenter="return false">
1.只允许输入数字
2.禁止汉字
3.允许paste,但不破坏clipboard
4.禁止drag
===================================================
禁止复制选择等
===================================================