ios inHouse 发布应用

一、明确几个概念

1、企业版IDP: 即iOS Development Enterprise Program。注意是$299/Year那种,并不是$99/Year的那种

2、In House:是指企业内发布,仅限企业内部人员使用。

二、In-House 特点:

1、不能发布到AppleStore进行销售

2、不需要Apple评审  

3、可以使用任何一支的私有API   

4、可以安装到任何苹果设备上,无需任何签名和认证

5、用户安装只要一个ipa文件,无需证书和签名文件

三、证书的生成过程

1、生成开发和发布证书(cer 文件),和$99账号一样

2、创建App ID,和$99账号一样

3、创建开发mobileprovision文件,和$99账号一样

4、创建发布(in-house)mobileprovision文件,这个如下图和$99账号不同。AdHoc的发布方式和$99是一样的,这里我们选择的In House

5、把刚刚生成的证书和签名文件都安装后,就可以开始我们的发布了。

四、In-House打包

简单过程:Product–>Archive–>(Validate、Submit、Export) Export–>Save for Enterprise Deployment 点击Next,选择对应的企业证书后点击Export 即可成功。(Xcode 6以下ipa 和 plist 同时生成,Xcode6以上 只生成ipa,可copy之前的plist 修改即可)。 

五、企业网页服务器分发

1、按照三、四 步骤 创建ipa 和 plist ,把打包的ipa 放到服务器上,ios设备通过访问网址,即可安装

2、创建web页面 ( 注意:ios7 plist 之前的版本用http,但ios7之后必须使用https)

<!DOCTYPE html>  
    <html>  
    <head>  
      <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
      <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />   
      <title>Install Geoloqi</title>  
      <style type="text/css">  
        body {  
          background: url(bkg.png) repeat #c5ccd4;  
          font-family: Helvetica, arial, sans-serif;  
        }  
        .congrats {  
          font-size: 16pt;  
          padding: 6px;  
          text-align: center;  
        }  
        .step {  
          background: white;  
          border: 1px #ccc solid;  
          border-radius: 14px;  
          padding: 4px 10px;  
          margin: 10px 0;  
        }  
        .instructions {  
          font-size: 10pt;  
        }  
        .arrow {  
          font-size: 15pt;  
        }  
        table {  
          width: 100%;  
        }  
      </style>  
    </head>  
    <body>  
       
    <div class="congrats">点击下面图标下载 XXX-App</div>  
       
    <div class="step">  
      <table><tr>  
        <td class="instructions">安装IOS<br />XXX-App</td>  
        <td width="24" class="arrow"></td>  
        <td width="72" class="imagelink">  
          <a href="itms-services://?action=download-manifest&url=https://www.xxx.com/TestInHouse/raw/master/xxx-app.plist">  
            <img src="icon.png" height="72" width="72" />  
           </a>  
        </td>  
      </tr></table>  
<table><tr>  
        <td class="instructions">安装Android<br />作业盒子XXX-App</td>  
        <td width="24" class="arrow"></td>  
        <td width="72" class="imagelink">  
          <a href="http://www.xxx.com/xxx.apk">  
            <img src="icon.png" height="72" width="72" />  
           </a>  
        </td>  
      </tr></table>  
    </div>  
    <script>
function isWeiXin(){
var ua = window.navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i) == 'micromessenger'){
return true;
}else{
return false;
}
} 
if (isWeiXin()) {
  alert("请用浏览器打开!");
}
  </script>
    </body>  
    </html>

3、部署和测试 在手机上输入指定的网址,即可实现安装。

plist 文件如下:

plist 外站链接可选择: https://git.oschina.net,, 通过新建项目–>点+ 填入文件名–>把plist文件拷贝到内容区–>提交 即可.

遇到问题参考:

1、http://blog.csdn.net/zhaoxy_thu/article/details/17277527

2、http://stackoverflow.com/questions/20276907/enterprise-app-deployment-doesnt-work-on-ios-7-1/22767699#22767699

3、https://laoyur.com/?p=414

4、http://blog.csdn.net/zhaoxy_thu/article/details/21133399

5、http://www.2cto.com/kf/201312/264286.html

6、http://stackoverflow.com/questions/20276907/enterprise-app-deployment-doesnt-work-on-ios-7-1/22367111#22367111

7、http://www.cnblogs.com/zzy0471/p/3658572.html

Discuz的2003 cannot connect错误的一种解决方法

今天早上,无缘故的出现Discuz论坛无法连接的黄页,黄页的内容是discuz 2003 notconnect.

从表面上看是由于数据库无法连接导致的,但是查看了数据库的mysql服务,是正常启动的,无论是外部还是内部,都是可以连接数据库的.找了很多方法都没有办法定位原因,当然也没有办法解决.

突然间想到SELINUX,搜索了一下,发现SELINUX的确有可能会导致一些服务出现异常,

搜索了一下,网上有比较多的解决方法.一种是直接把SELINUX关闭.

一、查看SELinux状态命令:

1、/usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态
SELinux status:                 enabled

2、getenforce                 ##也可以用这个命令检查

二、关闭SELinux方法:

1、临时关闭(不用重启机器):

代码如下:

setenforce 0 #设置SELinux 成为permissive模式
#setenforce 1 设置SELinux 成为enforcing模式

2、修改配置文件需要重启机器:

修改/etc/selinux/config 文件

将SELINUX=enforcing改为SELINUX=disabled

重启机器即可.

另一种办法没有那么激进,添加SELINUX允许DB的远程访问.

修改apache远程访问数据库的布尔值

setsebool httpd_can_network_connect_db 1

什么是SELINUX

SELinux在linux中是保护系统的重要工具,它可以最大限度的保护系统的安全。也许有的人在使用过程中尝试着关闭过此工具,但是当考虑到要架设服务器的话,那就得重视它了。

假设我们希望允许远程匿名访问 Web 服务器,我们必须通过防火墙打开端口。然而,这意味着恶意人员可以尝试利用安全漏洞以及,如果他们损坏 Web 服务器进程,获得 apache 用户和 apache 组的权限来强行进入系统。懂点安全知识的人就知道很危险了,用户 / 组具有 document root ( /var/www/html )等的读取权限以及 /tmp 、/var/tmp 所有人均可写的任何其他文件 / 目录的写入权限。

SELinux 是一组可确定哪个进程能访问哪些文件、目录、端口等的安全规则。每个文件、进程、目录和

端口都具有专门的安全标签,称为 SELinux 上下文。上下文只是一个名称, SELinux 策略使用它来确定

某个进程是否能访问文件、目录或端口。默认情况下,该策略不允许任何交互,因此明确的规则授予访

问权限。如果没有允许规则,则不允许访问。

总之,SELinux 的目标之一是保护用户数据免受已泄漏的系统服务的威胁

SELinux 模式

为了进行故障排除,我们可以临时禁用 SELinux 保护,使用 SELinux 模式。

强制模式, SELinux 主动拒绝访问尝试读取类型上下文为 tmp_t 的文件的 Web 服务器。在强制

模式中, SELinux 不仅记录而且提供保护。

许可模式通常用于对问题进行故障排除。在许可模式中,即使没有明确规则, SELinux 也允许所有交

互,并且记录所有被拒绝的交互。此模式可以用于确定您是否有 SELinux 问题。无需重新引导即可从

强制模式转为许可模式,或再从许可模式转回强制模式。

禁用模式将完全禁用 SELinux 。您必须重新引导才能彻底禁用 SELinux ,或者从禁用模式

转为强制模式或许可模式。

装修清单

装修预算清单

辅料

  • 电线
  • 油漆
  • 水管
  • 水泥,黄沙

主材

  • 瓷砖
  • 地板
  • 马桶
  • 水槽
  • 台盆
  • 吊顶
  • 油烟气灶
  • 室内门

人工

  • 水电
  • 泥工
  • 木工
  • 油漆

家具

  • 柜子门
  • 电视柜,卧室柜子

五金

  • 卫生间五件套
  • 厨房五件套
  • 门栓
  • 门锁
  • 衣柜五金套件

家居用品

  • 沙发
  • 窗帘
  • 地毯

解决JSP乱码问题的方式和思考途径

JSP中的乱码问题是一个普遍的问题,对于初学者来说,没有经历过乱码,不算是真正的初学者。但是,乱码的解决方法却是有一定的策略的。一般来讲,需要做到以下几点。

1. 修改MYSQL服务器的编码
修改MYSQL的my.ini配置文件

default-character-set=utf8

2.修改MYSQL数据库的编码
修改已有的数据库编码

ALTER DATABASE databaseName CHARACTER SET utf8;

由于修改数据库编码不会影响到已经存在的表的编码,因此,还需要修改已经存在的表。

ALTER TABLE table_name CHARACTER SET utf8;

3.修改Tomcat服务器的默认编码
Tomcat的server.xml中有编码设置,设置如下

<Connector prot=“8080protocol=“HTTP/1.1connectionTimeOut=“2000redirectPort=“8443URIEncodeing=“UTF-8/>

4.修改JSP的页面编码
JSP页面的编码通常包括文件本身的编码和页面顶部的声明的编码

<%@ page language="java" import="java.util.*” pageEncoding="utf-8"%>

5.修改数据库连接字符串的编码
在创建connection时指定编码的方式,代码如下

Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/databaseWeb?unicode=true&characterEncodeing=UTF-8”,”root”,”admin”);

说说我家的规划

最近准备对家的事情多做一些规划,主要是包括家的一些装修和细节方面。

来看看家的地板图吧.地板图用来描述地板和地砖的铺设还是蛮方便的.

image

JSP连接数据库总结

最近学习Java,终于到了连接数据库了,各种教程中给出的示例都是Mysql适用的,不可否认,Java+Mysql算是一个不错的组合,全开源免费的环境也是互联网公司的最爱.

不过,很多系统还是SQL Server的,如果想一夜之间把这些系统换掉是一个不太可能的任务.

1. 下载并引入驱动包.

到微软官方站点下载驱动包,http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=21599.然后放到WebRoot\Web-INF\lib下面既可.我用的是sqljdbc4.jar,所说这个比较新.

2. 接着在页面顶端添加数据库所必须的几个引用.

<%@page import="java.sql.DriverManager" %>
<%@page import="java.sql.Connection" %>
<%@page import="java.sql.Statement" %>
<%@page import="java.sql.ResultSet" %>
<%@page import="com.microsoft.sqlserver.jdbc.SQLServerDriver"%>
<jsp:directive.page import="java.sql.Date"/>
<jsp:directive.page import="java.sql.Timestamp"/>
<jsp:directive.page import="java.sql.SQLException"/>

3. 再然后就是加载驱动,打开连接,建立查询命名,返回查询结果集,显示结果了.

具体的代码如下.

Connection conn=null;   
Statement stmt=null;
ResultSet rs=null;
String JDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";//SQL数据库引擎
String connectDB="jdbc:sqlserver://172.17.10.15//dev;DatabaseName=tech_doc";//数据源
    try
  {
   Class.forName(JDriver);//加载数据库引擎,返回给定字符串名的类
   conn=DriverManager.getConnection(connectDB,"User","Password");
    stmt=conn.createStatement();
   rs=stmt.executeQuery("select top 10 * from access_group");
   
   
   while(rs.next()){
   String group_id=rs.getString("group_id");
   String group_name=rs.getString("group_name");     
   }      
   }
   catch(SQLException ex){
   out.println();
   ex.printStackTrace();
   }finally{
   if(rs!=null)
   rs.close();   
      if(stmt!=null)
   stmt.close();
         if(conn!=null)
   conn.close();
   
   }

JAVA编程不得不看的几本经典书籍

入门类

1.《java从入门到精通》(第3版)

【内容介绍】

本书从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发应该掌握的各方面技术。全书共分28章,包括:初识Java,熟悉Eclipse开发工具,Java 语言基础,流程控制,字符串,数组,类和对象,包装类,数字处理类,接口、继承与多态,类的高级特性,异常处理,Swing程序设计,集合类,I/O输入输出,反射,枚举类型与泛型,多线程,网络通信,数据库操作,Swing表格组件,Swing树组件,Swing其他高级组件,高级布局管理器,高级事件处理,AWT绘图与音频播放,打印技术和企业进销存管理系统等。所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,可以使读者轻松领会Java程序开发的精髓,快速提高开发技能。

【推荐理由】

本书内容详尽,实例丰富,非常适合作为编程初学者的学习用书,也适合作为开发人员的查阅、参考资料。

2.《java核心技术卷一》

【内容介绍】

本书是Java技术经典参考书,多年畅销不衰,第7版在保留以前版本风格的基础上,涵盖Java2开发平台标准版J2SE5.0的基础知识,主要内容包括面各对象程序设计、反射与代理、接口与内部类、事件监听器模型、使用Swing UI工具箱进行图形用户界面设计,异常处理、流输入/输出和对象序列化、泛型程序设计等。本书内容翔实、深入浅出,附有大量程序实例,极具实用价值,是Java初学者和Java程序员的必备参考书。

【推荐理由】

本书出版以来,深受广大读者的喜爱,它全面介绍了Java SE的基础知识,不但具有使用价值,而且易于阅读,易理解,它必成为想进军Java和基础薄弱同学的不二之选。

3.《java编程语言》

【内容介绍】

本书以Java语言创建者的独特视角向读者展现了为什么以及如何使用Java语言,以便读者理解Java语言的基本设计目标以及它在现实世界中的应用。本书介绍的是Java语言的最新版本,该版本在《Java Language Specification,Second Edition》中定义,在Java2SDK1.3标准版中实现。本书已是第三版,在经构上相对前两版有所调整,重点讲述了新的语言特征,并提供了新API的使用实例。本书完全覆盖了Java语言当前版本的特征和类库,可以作为Java语言的入门向导,也可作为高级Java开发及Java语言教学的参考用书。

【推荐理由】

本书介绍的是Java语言的最新版本,该版本在《Java Language Specification,Second Edition》中定义,在Java2SDK1.3标准版中实现。本书已是第三版,在经构上相对前两版有所调整,重点讲述了新的语言特征,并提供了新API的使用实例。本书完全覆盖了Java语言当前版本的特征和类库,可以作为Java语言的入门向导,也可作为高级Java开发及Java语言教学的参考用书。

进阶类

1.《java编程思想》

【内容介绍】

本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、JavaI/O系统、枚举类型、并发以及图形化用户界面等内容。这些丰富的内容,包含了Java语言基础语法以及高级特性,适合各个层次的Java程序员阅读,同时也是高等院校讲授面向对象程序设计语言以及Java语言的绝佳教材和参考书。

【推荐理由】

本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在BruceEckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。

2.《java核心技术卷二》

【内容介绍】

《JAVA核心技术卷2:高级特征》是Java技术权威指南,全面覆盖Java技术的高级主题,包括流与文件、XML、网络、数据库编程、高级Swing、高级 AWT、JavaBean构件、安全、分布式对象、脚本、编译与注解处理等,同时涉及本地化、国际化以及Java SE 6的内容。《JAVA核心技术卷Ⅱ:高级特征》对Java技术的阐述精确到位,叙述方式深入浅出,并包含大量示例,从而帮助读者充分理解Java语言以及Java类库的相关特性。

【推荐理由】

本书是经典的《Java核心技术,卷II:高级特性》的最新修订版,涵盖了Java SE6平台的高级用户界面程序设计和企业特性。与第1卷(涵盖了核心的语言和类库特性)一样,本卷已经更新到了JavaSE6。并且对新内容都作了重点标注。书中所有的示例程序都进行了详细的设计,用来演示最新的编程技术。并展示针对专业开发者在现实中所碰到的典型问题的最佳解决方案。本书包含有关StAXAPI、JDBC 4、编译器API、脚本框架、闪屏和托盘API以及其他许多JavaSE6改进特性的新章节。本书聚焦于Java语言中更高级的特性,包括下列内容:流与文件、网络、数据库编程、XML、JNDI与LDAP、国际化、高级GUI组件、Java2D、JavaBeans、安全、RMI与Web服务、高级AWT、注解、本地方法。

3.《疯狂java讲义》

【内容介绍】

本书深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、Java注释、Java的IO流体系、Java多线程编程、Java网络通信编程和Java反射机制。共覆盖了java.awt、java.lang、java.io和java.nio、java.sql、java.text、java.util、javax.swing包下绝大部分类和接口。

【推荐理由】

本书并不单纯从知识角度来讲解Java,而是从解决问题的角度来介绍Java语言,所以本书中介绍了大量实用案例开发。这些案例既能让读者巩固每章的知识,又可以让读者学以致用、激发编程自豪感,进而引爆内心的编程激情。本书光盘里包含书中所有示例的代码,如果读者希望获得课后练习的程序代码。

本书为所有打算深入掌握Java编程的读者而编写,适合各种层次的Java学习者和工作者阅读,也适合作为大学教育、培训机构的Java教材。但北大青鸟光谷校区专业老师认为,如果只是想简单涉猎Java,则本书过于庞大,不适合阅读。

JavaEE类

1.《javaWeb整合开发王者归来》

【内容介绍】

本书全面介绍了Java Web开发中的各种相关技术及知识。全书分为9篇,内容层次清晰,难度循序渐进。第1篇为入门篇,内容包括Java Web开发概述等;第2篇为基础篇,内容包括Servlet技术、JSP技术、会话跟踪、过滤器Filter、监听器Listener等;第3篇为高级篇,内容包括JSTL标签库的使用、如何自定义标签、资源国际化、数据库概述、JDBC详解、XML概述等;第4篇为Struts框架篇,内容不仅包括Struts 1.x的内容,也包括Struts 2.x中的内容;第5篇为Hibernate框架篇;第6篇为Spring框架篇;第7篇为EJB与Web服务篇,内容包括EJB 3概述、JPA规范Web服务框架XFire等;第8篇为工具篇,内容包括在Java Web项目中常用的开源工具框架、主要有版本管理工具SVN、日志工具commons-logging与Log4J、报表图形引擎JFreeChart、PDF组件iText等;第9篇为实战篇,内容为两个典型的应用系统:论坛系统(Spring+Struts+Hibernate)、宠物商店(EJB 3+JPA+Struts 2)。

【推荐理由】

资深Java程序员耗时一年时间写作,十年开发经验毫无保留。全面、系统、深入介绍Java Web开发的核心技术与主流框架。

2.《spring 入门到精通》

【内容介绍】

本书由浅入深,循序渐进地介绍了Spring的体系结构和相关知识点,目的是帮助初学者快速掌握Spring,并能使用Spring进行应用程序的开发。本书最大的特色在于每章都是由浅入深,从一个简单的示例入手,让读者快速了解本章内容,然后再详细讲解本章涉及的基本原理和知识点,最后再通过一个详细的示例宋巩固所学内容。本书每一章的例子都是经过精挑细选,具有很强的针对性,力求让读者通过亲自动手做而掌握其原理和方法,从而学习尽可能多的知识。本书适用于初、中级软件开发人员,同时也可用作高校相关专业师生和社会培训班的教材。

【推荐理由】

全书共分14章,内容涵盖了Spring的基础概念、核心容器、Spring AOP、事务处理、持久层封装、Web框架、定时器、Spring和Struts、Spring和Hibernate、Spring和Ant、Spring和Junit。本书适用于初、中级软件开发人员,同时也可用作高校相关专业师生和社会培训班的教材。

3.《JavaWeb开发详解》

【内容介绍】

本书共分4部分,从XML、Servlet、JSP和应用的角度向读者展示了Java Web开发中各种技术的应用,循序渐进地引导读者快速掌握Java Web开发。

【推荐理由】

本书内容全面,涵盖了从事Java Web开发所应掌握的所有知识,在知识的讲解上本书采用理论与实践相结合的方式,从程序运行的内部机制进行分析讲解,并通过大量的实例和实验来验证并运用本书的知识。

C#读取通信达行情数据缓存文件

最近这段时间对股票有了兴趣,当然也没有少亏,现在明白玩股票的,说不亏赚钱什么都是骗人的,钱能不能赚,当然是肯定的,但好不好赚,就不一定了.

作为数据时代的码农,对一个交易系统进行研究的动力可是不小的,这不,今天就从最简单的开始吧.

行情数据保存在.day文件中,采用的是结构体保存的方式.

    public struct StockInfo
        {
        public int date;
        public int open;
        public int high;
        public int low;
        public int close;
        public int amount;
        public int vol;
        public int reservation;
        }

由上面的结构体可以看出其基本的数据结构还是比较简单的.

日期,开盘价,最高价,最低价,收盘价,成交量,成交额,还有最后一个是保留位.

了解了结构体的数据结构以后,再读取就相对比较简单了,简单来讲,就是把二进制中的数据反序列化出来.就可以了.接下来我们来一步一步的分析这个过程.

1. 首先是获取读取的文件内容.

这个相对比较简单,C#有标准的二进制读取方法.

  public static byte[] ReadInfo(string file, int read)
            {
            FileStream fs = new FileStream(file, FileMode.Open);

            FileInfo fileInfo = new FileInfo(file);

            BinaryReader br = new BinaryReader(fs);

            byte[] bt = br.ReadBytes(Convert.ToInt32(fileInfo.Length));
            br.Close();
            fs.Close();

            return bt;
            }

上面的代码应该不需要解释,就是从文件开始读到最后一行呗.相当简单的事情.

2. 接下来,就是按照结构体的大小解析读到了byte[]数组.

这个解析就比较简单,用到了几个本地操作的函数.我们先来看一下代码

       private static StockInfo Byte2Struct(byte[] arr)
            {
            //获取结构体的大小
            int structSize = Marshal.SizeOf(typeof(StockInfo));
            //分配结构体大小的空间
            IntPtr ptemPtr = Marshal.AllocHGlobal(structSize);
            //将byte数组拷贝到分配好的内存空间
            Marshal.Copy(arr, 0, ptemPtr, structSize);
            //将内存空间转换为目标结构体
            StockInfo stock = (StockInfo)Marshal.PtrToStructure(ptemPtr, typeof(StockInfo));
            //施放内存空间
            Marshal.FreeHGlobal(ptemPtr);

            return stock;
            }

上面最重要的就是通过sizeof获取结构体的二制保存的字节的大小.

然后通过互操作类分配内存空间,把数组拷贝到内存,再把内存中的数据写入到结构体.相对来说,没有什么复杂的事情.

3. 用主函数将这些操作链接起来.简单来讲,就是读取文件,然后获取记录的条数.用循环读取每一条记录.

            byte[] bt = ReadInfo(filename, 288);

            int structSize = Marshal.SizeOf(typeof(StockInfo));

            int num = bt.Length / structSize;

            for (int i = 0; i < num; i++)
                {
                byte[] temp = new byte[structSize];
                Array.Copy(bt, i * structSize, temp, 0, structSize);

                StockInfo stock = new StockInfo();
                stock = Byte2Struct(temp);

                Console.Out.WriteLine(stock.date + " " + stock.open / 100.00 + " " + stock.close / 100.00 + " " + stock.high / 100.00 + " " + stock.low / 100.00 + " " + stock.amount + " " + stock.vol + " " + stock.reservation);

                }

这样子来看,其实读取二进制也不复杂,只要知道原始结构体,读取还是比较简单的.

每日行情读取完了,就可以进行第二步了,就是制定自己的操作策略,然后制定程序化交易的模型了

JSP基本概念学习(2)

JSP指令

格式

<%@ directive attribute=value%>

上面的格式中的星号代表可以有0或者多个属性

常见的directive可以有page,taglib,include等

page 指令

最常用指令,用于声明页面的属性。多个属性可以写在一个指令中,也可以分开写,但每个指令(import除外)只允许出现一次。

include指令

最常用的指令之一,用于包含jsp页面或者HTML页面,达到页面重用的目的。

<%@ include file=“foot.jp”%>

还有一种使用JSP命令的包含方式

<jsp:include page=“foo.jsp”/>

两者的区别是include是先包含后编译,后者是先运行后包含。也就是说,前者有可能会有变量名冲突的总是,后者由于是编译结果的包含,所以不存在这个问题。但也没有办法做到变量共享和重用了。

taglib指令

taglib用来指明JSP内置的标签库,它有两个属性,一个是URI,另一个是prefix属性。格式如下:

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

JSP 行为

格式: <jsp:elements { attribute=“value”}/>

JSP行为中最常用的就是include行为。

JSP行为可以更好的组织代码,因为它基本上可以代替原来JSP中出现的<%%>代码块完成相应的功能。

Java Bean(POJO)

JavaBean 是普通的Java类。也叫POJO,这种类只有私有属性与对应的getter和setter方法。

useBean

用于在JSP中定义一个Java Bean对象,其格式为

<jsp:useBean id=“benaId” class=“className” scope=“Value”/>

scope可以为page,request,session,application中的任何一种。

getPropert和setPropery

这两个行为用于获取和设置JavaBean的属性。

EL表达式

EL表达式是指用“${}”括起来的脚本,用来更方便的读取对象。EL只能写在JSP的HTML代码中,不能写在<%%>的JSP脚本中。

${param.foo}

EL表达式类似于MVC中的Razor语法引擎,不同的是MVC中的Razor更进一步,也更更方便一些。

EL表达式是不能直接访问普通的方法和静态属性的。这点需要注意。

在现有的Java EE(J2EE)系统中,Servlet只用于处理业务逻辑,而JSP通常只用于显示结果。也就是说,一般的现代框架中,其视图引擎使用的多是JSP。

当然,使用其它的语言作视图引擎也是可以的,例如使用PHP作为View显示,而使用Java 的Servlet作为后台处理逻辑就是很多互联网公司的做法。而且相当不错。