J2EE的十三种技术(规范)
JSP学习:
语法基础:
注 释 输出注释 隐藏注释
<!-- --> <%-- --%>
脚本元素 声明 表达式 脚本程序
<%! %> <%= %> scriptlet
指令元素 page include taglib
<%@include file=” ”% %>
动作元素 include forward param plugin
<jsp:include page=" " flush=”true”//>
usebean setProperty getProperty
前者是指令元素,后者是动作元素。
JSP指令:
表达式 <%@include file=""%>
该指令只是静态包含文件,不能为一个动态的地址,而且不带任何参数,服务器将对包含近来的文件进行编译。
JSP动作元素:
表达式 <JSP:include page="" flush=”true”/ >
可以包含静态或动态文件,包含静态文件时服务器不对包含的文件编译,而在包含动态文件时服务器会编译包含动态文件,会自动判断包含文件是动态还是静态。
与include指令不同,该动作元素在JSP页面被用户请求时,才将指定文件插入服务器的响应输出中。
include指令和jsp:include动作的区别:
调用的时间:
jsp:include动作在“请求期间”被包含。
include 指令在“转换期间”被包含。
包含的内容:
jsp:include动作是包含jsp页面或servlet的“输出”和HTML文 本。
include指令是文件的实际内容。
<%@ include file=” ”%>,jsp的include指令元素读入指定页面的内容。并把这些内容和原来的页面融合到一起。(这个过程是在翻译阶段:也就是jsp被转化成servlet的阶段进行的。
页面中不能指定多个contentType. , 静态,动态包含
执行时间上:
<%@ include file=”relativeURI”%> 是在翻译阶段执行
<jsp:include page=”relativeURI” flush=”true” /> 在请求处理阶段执行.
引入内容的不同:
<%@ include file=”relativeURI”%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.
<jsp:include page=”relativeURI” flush=”true” />引入执行页面或servlet所生成的应答文本.
另外在两种用法中file和page属性都被解释为一个相对的URI.如果它以斜杠开头,那么它就是一个环境相关的路径.将根据赋给应用程序的URI的前缀进行解释,如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释。
数据库编程:
JDBC
连接数据库 Connection DriverManager
访问数据库 Statement PreparendStatement CallableStatement ResultSet
元数据操作 DatebaseMeta
数据分页 ResultSetMetaDate
<jsp:include />动作与 include指令的比较[W1] | ||
格式 | include指令 | <jsp:include /> |
作用时间 | 页面持续时间 | 请求时间 |
包含内容 | 文件的实际内容 | 页面的输出 |
影响主页面 | 可以 | 不可以 |
内容变化时是否需要手动修改包含页面 | 需要 | 不需要 |
编译速度 | 较慢(资源必须被解析) | 较快 |
执行速度 | 较快 | 较慢 |
灵活性 | 较差(页面名称固定) | 更好(页面可以动态指定) |
.net服务器端包含:(Server Side Include SSI) #include <!-- #include virtual = "/myapp/ " --> 虚拟目录 <!-- #include file=" " --> 物理目录 <script> <script language="c#" runat="server" src=" ">[W2] </script> |
<jsp:forward page="forward.jsp" />
<jsp:plugin type="applet" code="clock.class"
javaversion="1.2" width="160" height="150">
<jsp:useBean id="cart" scope="session" class="session.cart" />
<jsp:setProperty name="cart" property="balance" value="0.0" />
<jsp:getProperty name="calendar" property=" " /> [W3]
Runtime.getRuntime().freeMemory() 当前系统空闲内存
Runtime.getRuntime().totalMemory() 所有内存
out.println(new java.util.Date()); 输出日期对象
out.println(new Date().toLocaleString());
out.println(our.getBufferSize()); 缓冲区大小
out.println(our.getRemaining()); 缓冲区剩余大小
request.setHeader("refresh","2"); 刷新页面
Cookie应用:
测定多少人访问过
测定访问者有多少是新用户(即第一次来),多少是老用户
测定一个用户多久访问一次网站
传递cookie对象 response.addCookie(c)
读取cookie对象 Cookie[] c = request.getCookies();
取出符合需要的cookie对象,需要循环比较数组内每个对象的关键字
设置cookie对象的有效时间 c.setMaxAge(3600)
include指令应该会快点吧
不要在这个标签放置其他编程逻辑,要使用另外一组<script>
通常将包含文件分为多个小文件
如果使用<jsp:getProperty来检索的值是空值,则NullPointerException
Cookie与session区别 | ||
比较项目 | Cookie | session |
存在期限 | 浏览器关闭前及设定时间内 | 浏览器关闭之前及默认时间内 |
存在方式 | 客户机 | 服务器 |
数量限制 | 20(同一服务器) | 无 |
类 | cookie | session |
处理速度 | 快 | 慢 |
对象作用范围 | |
request | 客户端的一次请求(可以包含多个页面) |
session | 首次访问时,产生新的会话,以后可以记住此会话状态 生命周期:会话超时,或者服务器端强制使会话失效 |
application | 全局作用范围 生命周期:应用程序启动到停止 |
Page | 一个JSP页面 |
jsp与.net输出区别获取数据 | |
jsp | .net |
<%= %> <% out.print( ); %> System.out.print( ); 控制台 | <%= %> <% Response.Write( ); %> Console.WriteLine( ); 控制台 |
javascript Document.write |
|
String s = request. getParameter("Name"); String value=Request.Cookies["key"]; |
String s=Request.QueryString["Name"]; |
<%! %> jsp定义的全局变量
编译成servlet后成为servlet的私有成员变量
网页重定向区别 | |
jscript | window.location.href = " " //window可以省略 [W1] window.location.reload |
jsp | <jsp:forward page=" " /> 或者 <jsp:forward page=" "> </jsp:forward> |
Response.sendRedirect("http:// ") response.setHeader("Refresh","5;URL=login.htm") | |
.net | Response.Redirect("http:// ") Response.AddHeader("Location", "http://www.yahoo.com.cn"); |
Server.Transfer("URL"); //性能比Redirect高,具有允许目标页从源页中读取控件值和公共属性值,由于调用这方法后,浏览器不会反应更改后的浏览器信息,因此它也适合以隐藏URL的形式向用户呈现页面,如果用户按后退或剧新有可能导致意外情况 | |
php | header("Location: index.php"); |
html | <META HTTP-EQUIV="Refresh" CONTENT=0; URL=index.php"> |
当然也可以respone.write(<script>alert('添加成功');location.href('指向页面的地址')</script>);等方式
编码转换 | |
jscript ajax | xmlhttp.setReauestHeader('Content-thpe','application/ ') |
jsp | <%@page contentType="text/html; chaset=GB2312" %> <%@ page pageEncoding="utf-8"%> request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8");
public void doGet(HttpServletRequest req,HttpServletResponse res) { //业务逻辑 try { //中文乱码 res.setContentType("text/html;charset=gbk"); |
.net | <%@ Page Language="c#" ResponseEncoding="gb2312"%> Encoding encoding; <% Response.Charset = "GBK" ; %> <% Response.ContentType= "text/HTML" ; %> |
php | header("Content-type: text/xml; charset=utf-8"); $author = iconv('utf-8','gb2312',$author); mysql_query("set names 'gb2312'"); |
html | <meta http-equiv=“Content-Type;content=text/html; charset=gb2312; /> |
xml | < xml version="1.0" encoding="ISO-8859-1" > |
采用UTF-8编码,除了要将文件另存为UTF-8格式之外,还需要同时指定codepage及charset
编码加密 | |
jscript ajax | escape 编码 加密 unescape 解除编码 document.write(unescape(escape( '<html><><>fdsfsdfsdfsdf<><><</html>' ))); //这样就可以加密 输出的内容
encodeURI() 函数 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码:- _ . ! ~ * ' ( ) 。 该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#
微软对脚本文档加密的工具 Script Encoder 是个命令行工具
利用js文件连接,<script src="fdfdf.js"> </script> |
jsp |
|
.net | 防止脚本入侵: Response.Write(Server.HtmlEncode("<script> alert(/"脚本入侵/")</script>")); //进行编码转换 Response.Write("<script> alert(/"脚本入侵/")</script>"); //没有进行编码转换 |
php | 加密函数:crypt() md5() shed()
mysql urlencode() URL编码 urldecode() 解码
如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。
|
Servlet:
配置服务器:
JAVA_HOME
TOMCAT_HOME
Tomcat三个功能
web服务器
jsp容器
servler的容器
开发servlet有三种方法: 需引入servlet-api.jar
实现servlet接口 DEMO
继承GenericServet 只需重写service方法即可DMEO
继承HttpServlet DEMO
HttpServlet用户登录DMEO
tomcat的配置:
修改tomcat端口 conf目录下的server.xml <Connector port = "8080" //理论上1~65535可以放,但1~1024(有名端口)最好不要设置
设置虚拟目录 server.xml 文件,在<Host>元素内添加 <Context path="/myWebsite" docBase="c:/myWebsite" debug="0" />
也可以用conf --- calfo ------local---------下新建一个...xml文件,就代表一个web应用
给tomcat的管理员设置密码 tomcat-users.xml <user。。。
设置数据源和连接池(公司常用) 1.用tomcat admin里配 2.server.xml配置DMEO
在server.xml文件中加了中文注释的就要在首行加
<?xml version="1.0" encode="gb2312"?> 默认情况下它是没有的
编程连接数据源:
import javax.*;
import javax.naming.*;
private Connection ct = null;
//创建一个上下文环境
Context con = new javax.namxing.InitialContext();
//通过con得到数据源
DataSource ds = con.lookup("java:comp/env/shunping");
ct.ds.getConnection();
java.lang.Runtime.getRuntime().exec("shutdown -h now"); //关机命令
set path = %path%;c:java......
jar -cvf test.war *.* //把网点目录下的所有文件打包到 test.war
表单提交数据get请求和post请求的区别
post安全点
get提交的数据不能大于2K,而post提交的数据理论上不受限制,但实际编程中建议不要大于64K
get响应速度快点,get 要求服务器立即处理请求;post请求可能形成一个队列请求
var url =location.href;
好像得到当前的网页地址
同一用户的不同页面共享数据:
1. cookie DEMO
2. sendRedirect跳转
3. session DEMO
默认存放时间为30min,是指用户的发呆时间,并不是相隔时间。也可以修改 1在web.xml中修改,2在程序中修改,如下
q.setMaxTnactiveInterval(20); //按秒计算的
q.setMaxTnactiveInterval(0); //整个Session都为空
当某个浏览器访问网站时,服务器会给浏览器分配一个唯一的session id,并以此来区分 不同的客户端
因为session的各个属性要占用服务器的内存,因此迫不得已的情况下才使用
4. 隐藏表单提交(form)<input type=hidden name=a value=b>
ServletContext :相当于.net 的Application
可以把它想像成一个共用的空间,可以被所有的客户访问
this.getServletContext() 得到一个实例
添加一个属性:setAttribute( , )
得到值 : getAttribute( )返回object
删除属性 removeAttrubute()
SerbletContext中的属性的生命周期从创建开始,到服务器关闭结束
分页技术:
定义四个变量
int pageSize 每页显示多少条记录 是指定的
int pageCount 一共有多少页 计算出来的
int pageNow 希望显示第几页 是用户选择的
int rowCount 一共有多少条记录 从表中查询得到的
反编译工具
JAD
FrontEnd
用反编译命令:javap -c -package -public -private hello_java hello.java
得到的反编译结果(hello.java)如下:(有关javap命令的选择参数请见其使用说明,这里-c表示选择了反编译)
java的关键字
abstract | do | implement | private | this |
boolean | double | import | protected | throw |
break | else | instanceof | public | throws |
byte | extend | int | return | transient |
case | false | interface | short | true |
catch | final | long | static | try |
char | fianlly | native | strictfp | void |
class | float | new | super | volatile |
continue | for | null | switch | while |
default | if | package |
| synchronized |
Java的文档注释
– @author<作者姓名>
– @version<版本信息>
– @param<参数名称><参数说明>
– @return<返回值说明>
Java jvm运行过程:
装入
校验
运行
(垃圾回收等)
反编译:jad