request.getcontextPath() 详解
文章分类:Java编程
<%=request.getContextPath()%>是为了解决相对路径的问题,可返回站点的根路径。
但不用也可以,比如<a href="<%=request.getContextPath()%>/catalog.jsp">,可以直接用<a href="catalog.jsp">也行,这两个文件是在同一个目录下的。比如你要生成一个文件放在服务器上得一个目录下,可以使用request.getContextPath()+/dir,组成一个完整得目录结构!
但在JSP文件里,有时通过request.getContextPath()得到的路径却为空,为什么?
context中没有配置path属性,所以你的工程文件就是在根目录下,相当于path="";
即是你直接在浏览器中输入你的服务器ip就会到你的jsp页面,而不是tomcat的默认页面;所以你通过request.getContextPath()得到的字符串是为空的;它是获得虚目录的;
如果你想得到工程文件的实际物理路径,可通过:<%=request.getRealPath("/")%>,这样页面就会输出:d:/web。
参考servlet中的接口:
request.getScheme();
返回的协议名称,默认是http
request.getServerName()
返回的是你浏览器中显示的主机名,你自己试一下就知道了
getServerPort()
获取服务器端口号
request.getContextPath()应该是得到项目的名字,如果项目为根目录,则得到一个"",即空的字条串。如果项目为abc, <%=request.getContextPath()% > 将得到abc,服务器端的路径则会自动加上,<a href="XXXX.jsp"> 是指当前路径下的这个xxx.jsp页面,有时候也可以在head里设置html:base来解决路径的问题,不过用的最多的还是request.getContextPath。
在js文件中得到request.getContextPath()的值,不想在JSP中写太多的Javascript代码:
一种方法是用hidden:
<input type=hidden name=contextPath value=<%= request.getContextPath()>
再就是在本页面的js里面也是可以使用Scriptlet来赋值的:
var a = '<%= request.getContextPath()>'
或者你赋值给一个hidden的控件都是可以的,然后js取,这样js可以不用写在jsp里。
实际应用中,一般用来解决jsp测试和生产环境路径不同的问题:
<%
String appContext = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+ request.getServerPort() + appContext;
%>
第二篇:java
1. 与C、C++不同,Java在数组的定义中并不为数组元素分配内存,因此[ ]中不用指出数组
中元素的个数,即数组长度,而且对于如上定义的一个数组是不能访问它的任何元素的。
2. Java语言允许类型相同,而长度不同的两个数组互相赋值。赋值的结果是两个数组名指
向同一数组。
3. Java中数组长度在声明时不用指定,而是创建时由所开辟的内存单元数目确定。.
4. 字符串变量一般存放在StringBuffer类的对象中。
5. 基本类型被包装后就具有实例化,可被继承等面向对象的特征。
6. StringTokenizer("Helloworld!Thisis Java code,stringTokenizer Demo.", ",. ")分隔出7个子串。
7. 定义方法时可用数组作形参,且只指定数组名和数据类型,不指定长度。
8. 在java.util包中的Arrays类提供了一些操作数组的方法。
9. Map<K, V>或HashSet<Student>是java泛型,所操作的数据类型为指定类型。
10. 定义泛型类时,可以向类型参数指定任何类型信息,特别是集合框架操作中,可以最大
限度的提高泛型类的适用范围。
11. 和非泛型类一样,泛型类既可以作为父类也可以作为子类,在泛型类的继承层次中,全
部子类必须将泛型父类所需的类型参数沿继承层次向上传递。
12. Java并没有真正实现泛型,是编译器在编译的时候在字节码上做了手脚(称为擦除),
是编译器级别的,虚拟机并不知道有没有泛型。
13. 泛型本质上是指参数化类型。
14. 泛型的类型参数只能是类类型(包括自定义类),不能是基本数据类型。
15. 有序集list特性:允许有重复对象,对象的存储按照插入的顺序排列。
16. 映射map特性:集合中放置一对对象(关键字key-values),即key和values均为参数。不
允许有重复的key,key无顺序。
17. HashSet是无序集合的类,使用哈希表实现,因操作(查询、插入、删除等)速度快,
比较适用于内容规模较大的元素。
18. IP地址是一个32位的二进制地址,分为4组,每组8位,由小数点分开,用四个字节
来表示,每个字节的数值范围是0~255。
19. 端口不是机器上物理存在的场所,而是一个软件抽象概念,提出这个概念的目的是,1024
以下的端口号保留给预定义的服务。例如:http使用80端口。
20. 端口号的范围为0~65535之间,0~1023之间的端口数是用于一些知名的网络服务和应用。
21. Java提供的网络功能: URL, Socket, Datagram.
22. URL用来网络资源定位,它的值由5部分组成,格式如下: <传输协议>://<主机名>:<端口
号>/<文件名>#<引用>
23. URL对象创建后,就可以通过它来访问指定的WWW资源。这时需要调用URL类的
openStream()方法,该方法与指定的URL建立连接并返回一个InputStream类的对象,这样访问网络资源的操作就变成了我们熟悉的I/O操作,接下来就可以用字节流的方式读取资源数据。
24. Java提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端
25. 创建一个基于TCP的客户端程序,首先要创建Socket对象,该对象通过调用
getInputStream和getOutputStream方法获取输入流和输出流进行通讯。
26. 类URLConnection也是定义在包java.net里,它表示Java程序和URL在网络上的通信连
接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的URLConnection对象。
27. 在Java中,有一个用来存储internet地址的类是InetAddress
28. ServerSocket类用于侦听一个客户端的Socket连接,如果没有连接,它将一直等待。
29. 所谓数据报(Datagram)就跟日常生活中的邮件系统一样,是不能保证可靠的寄到的,
而面向链接的TCP就好比电话,双方能肯定对方接受到了信息。
30. 智能手机(如iphone、android)可以通过socket或http方式与服务器程序进行交互,是事
实上的C/S模式。
31. 顶层容器就是不包含在其它容器中的容器,Swing中常用的顶层容器有JFrame。中间容
器不能作为顶层容器,它必须包含在其它容器中,例如,可以将中间容器放到JFrame顶层容器中。
32. 布局管理器用来管理组件在容器中的布局格式。当容器中容纳多个组件时,可以使用布
局管理器将这些组件安排在一个容器中。
33. FlowLayout称为“流布局”,将组件从左到右顺序、流动的安排到容器中,直到占满上
方的空间,则向下移动一行,继续流动。
34. 布局操作中取消布局的方法是:setLayout(null)
35. 当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,其变化规律是:组件
的大小不变,但是相对位置会发生变化。
36. BorderLayout称为“边界布局”,它允许将组件有选择地放置到容器的中部、北部、南部、
东部或西部.
37. 在使用BorderLayout的时候,如果容器的大小发生变化,其变化规律为:组件的相对位
置不变,大小发生变化。
38. 在基于Java的图形界面程序设计中,单击按钮会产生的事件是ActionEvent,判断关闭窗
口的事件,应添加WindowListener监听器.
39. CardLayout称为“卡片布局”,它将加入到容器的组件看成一叠卡片,只能看到最上面的
组件。通过调用CardLayout的一些方法,才能显示其中的组件。
40. GridLayout称为“网格布局”,它像表格一样,按行和列排列所有组件,且每个单元格大
小都一样;在向表格里面添加组件的时候,它们将按照从左到右,从上到下的顺序加入。使容器中各个组件呈网格状布局,平均占据容器的空间。
41. 常用的事件类包括ActionEvent(动作事件)、MouseEvent(鼠标事件)、KeyEvent(键盘
事件)等。
42. 监听接口中定义了抽象的事件处理方法,这些方法针对不同的操作进行不同的处理。
43. 适配器和监听接口所实现的功能相同,但适配器是类而不是接口,它实现对应监听接口
的多个事件处理方法(将这些方法都定义成空的),这样继承适配器后,可以仅重写需要的事件处理方法。
44. 事件包含三个组件:事件对象、事件源、事件处理程序
45. 监听类是实现监听接口的类,监听对象是监听类的实例化对象
46. 通过JFrame类的setJMenuBar()方法可以将菜单栏对象添加到框架的顶部,JFileChooser
类可用于打开和保存文件时所显示的对话框。JColorChooser是一个组件,而不是对话框,但该类中提供了一个用于创建颜色对话框的静态方法,该对话框包含颜色选择器组件。
47. TableModel本身是一个interface,在这个interface里面定义了若干的方法,包括了存取
表格字段(cell)的内容、计算表格的列数等等的基本存取操作,让设计者可以简单地利用TableModel来实现他所想要的表格
48. JPopupMenu是一种不固定在菜单栏中,随处浮动的弹出式菜单
49. 标准对话框有:消息对话框、确认对话框、输入对话框以及选项对话框4种
50. JTable并不存储自己的数据,而是从表格模型(TableModel)获取它的数据和操作方法。
51. Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,
它由一组用Java编程语言编写的类和接口组成。
52. Java中通过JDBC-ODBC桥接方式实现ODBC功能调用
53. 在Java中可以采用数据源的方式访问和操作txt文件、excel、access及多种数据库文件。
54. DriverManager类是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,
并在数据库和相应驱动程序之间建立连接。该类负责加载、注册JDBC驱动程序,管理应用程序和已注册的驱动程序的连接。
55. 在JDBC中,SQL的查询结果使用ResultSet封装,JDBC通过ResultSet维持查询结果集,
并提供游标进行数据操作
56. ResultSet对象维持了执行某个SQL语句后满足条件的所有的行,并提供一系列访问结果
集中数据的方法,通过调用ResultSet对象的方法,处理返回结果
57. Statement接口用于执行静态的SQL语句,静态的SQL语句不需要接收任何参数。
Statement主要功能是将SQL语句传送给数据库,并将SQL语句的执行结果返回。通过Statement实现静态SQL查询,使用PreparedStatement实现动态SQL查询,使用CallableSatement实现存储过程的调用
58. ResultSet封装了Statement的executeQuery()方法返回的结果集,即符合SQL语句中指定
条件的所有行。
59. ResultSet类对象负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,
通过适当的移动记录指针,可以存取数据库,加强程序的效率。
60. 在JDBC中执行数据库中的存储过程可以使用CallableStatement对象。
61. 在执行一个存储过程之前,必须先对其中的OUT参数进行类型注册,注册方式:
cstmt.registerOutParamenter(intindex,intsqlType);
62. 元数据(Meta Data),就是有关数据库和表格结构的信息,如:数据库中的表、表的列、
表的索引、数据类型、对SQL的支持程度等信息。DatabaseMetaData接口用于得到关于数据库的信息,ResultSetMetaData接口主要用来获取结果集的结构
63. JDBC默认的事务提交模式是自动提交。为了能将多个JDBC语句组合成一个操作单元,
以保证数据的一致性,可以禁止自动提交,之后把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交,倘若其中一个表达式操作失败,可以在异常捕获时调用rollback()进行回滚。通过setAutoCommit()方法控制自动提交模式,使用rollback()方法实现事务回滚
64. JDBC支持保存点操作,通过保存点,可以更好的控制事务回滚。
65. 常用的数据库存取优化方法有:使用prepared SQL语句和使用存储过程。
66. Email验证:\w+@\w+(\.\w+)+
67. 在Java中使用正则表达式,需要引入Java的java.util.regex包。java.util.regex包主要由
三个类所组成:Pattern、Matcher和PatternSyntaxException(用于匹配抛出的异常)
68. Pattern类没有提供公共的构造方法。要构建一个模式,首先必须调用公共的静态compile()
方法,它将返回一个Pattern对象。调用Pattern对象的matcher方法来获得一个Matcher对象。Java提供了Pattern和Matcher类进行正则表达式匹配
69. Matcher类是一个依靠输入的字符串来解析这个模式和完成匹配操作的对象。
70. 指定至少有一位数字,但不超过两个数字的正则表达式是[0-9]{1,2}
71. 正则表达式主要用来处理字符串,如匹配字符串、查找字符串、替换字符串等,一个正
则表达式就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式,常用的定义元素有元字符、字符类、转义字符、限定符、反义、逻辑或、分组等。
72. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配