我们都知道在weblogic中JSP是每次第一次访问的时候才会编译,这就造成第一次访问某个JSP的时候性能下降,有时候我们也希望JSP被编译成class然后打包在jar中实现隐藏JSP的功能,下面介绍自己几天来的研究成果。在这里weblogic采用的是weblogic12c。

  前提知道JSP编译之后存放的位置在:%base%\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_servlet文件夹下面。(Struts是我的项目根路径的名称,jsp_servlet是一个存放JSP编译之后的class文件的根文件)。

本文介绍的%base%表示E:\weblogic\user_projects\domains\base_domain\autodeploy\Struts,也就是项目的根目录

1.第一种预编译JSP的方法是手动的访问每个页面,然后让weblogic进行编译。(如果你有时间就这么做)

2.通过在weblogic.xml中设置JSP预编译

例如我的一个weblogic.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd"> <weblogic-web-app>
<jsp-descriptor>
<jsp-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</jsp-param>
<jsp-param>
<param-name>pageCheckSeconds</param-name>
<param-value>-1</param-value>
</jsp-param>
<jsp-param>
    <param-name>precompile</param-name>
    <param-value>true</param-value>
  </jsp-param>
<jsp-param>
<param-name>compilerSupportsEncoding</param-name>
<param-value>true</param-value>
</jsp-param>
<jsp-param>
<param-name>verbose</param-name>
<param-value>false</param-value>
</jsp-param>
</jsp-descriptor> <container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor> <context-root>/C8</context-root> </weblogic-web-app>

上面标红的地方就是设置weblogic对JSP进行预编译。

例如我项目中三个JSP文件的位置如下:

  %base%index.jsp

  %base%WEB-INF\jsps\index.jsp

  %base%\view\index.jsp

编译后的三个文件位置如下:

E:\weblogic\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_servlet\__index.class

反编译查看头信息:(也就是jsp_servlet是一个根目录)

    

E:\weblogic\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_servlet\_view\__index.class

E:\weblogic\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_user\Struts\km2umq\jsp_servlet\_web_45_inf_jsps\__index.class

  WEB-INF目录下的JSP比较特殊,会自动编译到jsp_servlet\_web_45_inf_jsps\目录下。

访问项目首页进行测试:  

  

有时候我们也希望将原来的JSP删掉,只保留编译后的class文件,这样可以隐藏JSP。如果在上面编译完之后只是将我们的JSP删掉,那么不会起作用。例如:

部署成功之后重新访问会报404:

我们将之前编译后的JSP打包放进项目的lib中:

ain/servers/AdminServer/tmp/_WL_user/Struts/km2umq
$ ls
jsp_servlet/ public/ war/ Administrator@MicroWin10-1535 MINGW64 /e/weblogic/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_user/Struts/km2umq
$ jar cvf ./jsp.jar ./jsp_servlet/
已添加清单
正在添加: jsp_servlet/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: jsp_servlet/_view/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: jsp_servlet/_view/__index.class(输入 = 5683) (输出 = 2656)(压缩了 53%)
正在添加: jsp_servlet/_web_45_inf/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: jsp_servlet/_web_45_inf/_jsps/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: jsp_servlet/_web_45_inf/_jsps/__index.class(输入 = 5715) (输出 = 2674)(压缩了 53%)
正在添加: jsp_servlet/__index.class(输入 = 5666) (输出 = 2649)(压缩了 53%)

在web.xml加入下面的配置:

  相当于springMVC入口一样,所以的jsp后缀请求都进weblogic的servlet中处理。(webservice的请求也是如此)

<servlet>
<servlet-name>JSPClassServlet</servlet-name>
<servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>JSPClassServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>

  再次启动访问项目即可,这样就达到了隐藏JSP和预编译JSP的目的。

:

3.Ant中用weblogic.jspc对JSP进行预编译

0.前沿

  有时候我们的项目采用ant进行部署,所以还必须ant编译JSP。于是研究了ant结合weblogic.jspc进行编译JSP的过程。

  实际上进行编译的JSPC位于:E:\weblogic\wlserver\modules\com.oracle.weblogic.package.jar内。

  我们发现E:\weblogic\wlserver\server\lib\weblogic.jar里面没有任何一个class,只有一个MANIFEST.MF,里面的classpath引入了几乎weblogic带的所有报,包括E:\weblogic\wlserver\modules下面的包。

  网上一篇关于  MANIFEST.MF中classpath的解释:

1. 基本格式  

属性名称+:+空格+属性值  

2. 没行最多72个字符,换行继续必须以空格开头  

3. 文件最后必须要有一个回车换行  

4. Class-Path 当前路径是jar包所在目录,如果要引用当前目录下一个子目录中的jar包,使用以下格式  

子目录/xxx.jar 子目录/yyy.jar  

技巧:多个jar包的引用,可以使用 .classpath 文件中classpathentry 的值  

5. 在任何平台上路径分割符都是 /,多个jar包引用以空格分开

Manifest-Version: 1.0
Agent-Class: com.ali.b2b.crm.dynamic.agent.MyAgentMain
Main-Class: com.ali.b2b.crm.dynamic.agent.Dynamic
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Boot-Class-Path: javassist.jar
Class-Path: lib/tools.jar lib/guava-r09.jar lib/guice-2.0.jar

  所以网上很多说jspc在weblogic包内,weblogic12的机制不是这样的,是在weblogic.jar内引入weblogic模块的其他包。编译JSP的话引入%weblogic%\wlserver\server\lib,这个模块自动依赖:%weblogic%\modules

    weblogic10.3.6确实在weblogic包内,不过还依赖其他许多lib。如果只是编译JSP,不想找的话可以引入两个目录下的lib分别是:%weblogic%\wlserver_10.3\server\lib,这个模块自动依赖:%weblogic%\modules

    

1.weblogic.jspc编译JSP的ant脚本:

<?xml version="1.0" encoding="UTF-8"?>
<project name="AppcTest" default="precompile" basedir=".">
<description>Sample build file using Ant to call WLS APPC</description>
<property name="wls_root" value="E:/weblogic" />
<property name="wls_home" value="${wls_root}/wlserver" /> <path id="wls.classpath">
<fileset dir="${wls_home}/server/lib">
<include name="*.jar" />
</fileset>
</path> <!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<!--compile JSP-->
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<arg line="-webapp E:/xiangmu/WebTest/WebContent/ -d C:/Users/Administrator/Desktop/wlappc -compileAll" />
</java>
</target> </project>

参数解释:

  在precompile任务中,调用了weblogic.jspc,该类位于com.oracle.weblogic.package.jar包内,因此要将此包放入classpath内,这就是classpathref的作用(classpath引入weblogic.jar,其MANIFEST.MF又引入相关jar包),fork是叉牛排用的大叉子,因其一个把手多个爪子的特色,故而被借用到计算机中来代称“指令的派生”,一生二,二生三,三生无穷。。我们知道ant本身必须跑在虚拟机环境之中,而每个任务也同样必须跑在一个虚拟机环境之中。这样就存在一个选择的问题:任务可以和ant处在同一虚拟机中,也可以不。fork正是来干这件事的,它来负责做决定。Maxmemory属性要指定,不然文件多了就会失败。Arg标签指定了weblogic.jspc的一些参数,这里是比较关键的几个参数,-webapp表示web应用所在的目录,编译程序会在此目录及其子目录寻找jsp文件,-d参数指示jsp编译后的class文件放哪里,一般是web目录下的WEB-INF/classes目录,-compileAll表示编译-d指定的目录及其所有子目录(包括WEB-INF目录)。

  如果我们想查看更多的参数解释可以运行如下ant:

<?xml version="1.0" encoding="UTF-8"?>
<project name="AppcTest" default="precompile" basedir=".">
<description>Sample build file using Ant to call WLS APPC</description>
<property name="wls_root" value="E:/weblogic" />
<property name="wls_home" value="${wls_root}/wlserver" /> <path id="wls.classpath">
<fileset dir="${wls_home}/server/lib">
<include name="*.jar" />
</fileset>
</path> <!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<!--compile JSP-->
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<arg line="-advanced" />
</java>
</target> </project>

结果:(然后自己去意会去把)

precompile:
[java] Usage: java weblogic.servlet.jsp.jspc20 [options] <jsp files>...
[java] where options include:
[java] -help Print the standard usage message.
[java] -version Print version information.
[java] -webapp <dir> Directory to be considered as the document
[java] root for resolving relative files.
[java] -verboseJspc whether JSP Compiler runs in verbose mode
[java] (default is false)
[java] -k continue compiling files, even when some fail
[java] -noPrintNulls show "null" in jsp expressions as ""
[java] -backwardcompatible Backward compatibility option.
[java] -charsetMap <charsetMapString> specify mapping of IANA or unofficial
[java] charset names used in JSP contentType
[java] directives to java charset names. E.g.,
[java] '-charsetMap x-sjis=Shift_JIS,x-big5=Big5'
[java] The most common mappings are built-in to
[java] jspc. Use this option only if a desired
[java] charset mapping isn't recognized.
[java] -maxfiles <int> Maximum number of generated java files to be
[java] compiled at one time.
[java] -forceGeneration Force generation of JSP classes. Without
[java] this flag, the classes may not be generated
[java] if it is determined to be unnecessary.
[java] -compressHtmlTemplate Remove additional white spaces in html
[java] template. Without this flag, html template
[java] will be output as is.
[java] -optimizeJavaExpression Optimize string concatenation in Java
[java] expression. Without this flag, Java
[java] expression will be output as is.
[java] -strictJspDocumentValidation Validate JSP document's format strictly
[java] with XML Parser.
[java] -keepgenerated Keep the generated .java files.
[java] -classpath <path> Classpath to use.
[java] -target <target> Target version.
[java] -d <dir> Target (top-level) directory.
[java] -encoding <options> Valid args are "default" to use the default
[java] character encoding of JDK, or named
[java] character encoding, like "8859_1". If the
[java] -encoding flag is not present, an array of
[java] bytes is used.
[java] -package <packageName> The package into which the .jsp files should
[java] be placed 这个参数用于设置默认的包名字,就是上面的jsp_servlet包名
[java] -superclass <superclass> The class name of the superclass which this
[java] servlet should extend.
[java] -advanced Print advanced usage options.

补充:ant也有编译的JRE版本,在编译JDK8的时候由于ant使用JDK7搞死我了--:

选中如图位置:External xxx....

配置ant的jre版本:

补充:如果有错误并且ant日志乱码,解决办法如下:

  在运行时修改ant 的运行时输出编码,我们添加(<sysproperty key="file.encoding" value="UTF-8" />) 后,控制台就可以正常显示中文了,如下:

    <!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<!--compile JSP-->
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<sysproperty key="file.encoding" value="utf-8"/>
<arg line="-advanced" />
</java>
</target>

补充:如果我们希望在编译的classpath中引入某个目录下的class文件作为classpath,办法如下dirset就是将与build.xml同级的build\classes目录引入classpath(一般eclipse编译后文件在这个目录):

    <path id="wls.classpath">
<fileset dir="${wls_home}/server/lib">
<include name="*.jar" />
</fileset>
<dirset dir="./build/classes">
</dirset>
</path>

3.编译打包之后我们同样需要在web.xml中引入weblogic带的jspServlet入口并且在weblogic.xml关掉jsp预编译(我们也可以用ant的loadfile结合replace任务进行替换web.xml内容)

web.xml中加入:

 <servlet>
<servlet-name>JSPClassServlet</servlet-name>
<servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>JSPClassServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>

附一个完整的可以部署的脚本:

<?xml version="1.0" encoding="UTF-8"?>
<project name="AppcTest" default="precompile" basedir=".">
<description>Sample build file using Ant to call WLS APPC</description>
<property name="wls_root" value="E:/weblogic" />
<property name="wls_home" value="${wls_root}/wlserver" />
<property name="adf_lib_root" value="${wls_root}/oracle_common/modules" />
<property name="common_lib_root" value="${wls_home}/common/deployable-libraries" />
<property name="dist.dir" value="dist" />
<property name="web.dir" value="WebContent" />
<property name="weblogic.autodeploy" value="E:/weblogic/user_projects/domains/base_domain/autodeploy" />
<!--import file -->
<import file="" /> <path id="wls.classpath">
<fileset dir="${wls_home}/server/lib">
<include name="*.jar" />
</fileset>
</path> <!-- =================================
target: clean
================================= -->
<target name="clean" description="--> description">
<delete dir="${dist.dir}">
</delete>
</target> <!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<arg line="-webapp E:/xiangmu/WebTest/WebContent/ -d E:/xiangmu/WebTest/WebContent/WEB-INF/classes -compileAll" />
</java>
</target> <!-- =================================
target: jar
================================= -->
<target name="jar" depends="" description="--> package java">
<jar destfile="E:/xiangmu/WebTest/WebContent/lib/commons-jsp.jar">
<fileset dir="E:/xiangmu/WebTest/WebContent/WEB-INF/classes" includes="*.class">
</fileset>
</jar>
</target> <!-- =================================
target: war
================================= -->
<target name="war" depends="clean,precompile" description="--> description">
<mkdir dir="${dist.dir}" />
<war destfile="${dist.dir}/TestPreCompile.war" webxml="${web.dir}/WEB-INF/web.xml">
<classes dir="${web.dir}/WEB-INF/classes">
</classes>
<fileset dir="${web.dir}">
<include name="**/weblogic.xml" />
</fileset>
</war>
</target> <!-- =================================
target: deploy_war
================================= -->
<target name="deploy_war" depends="war" description="--> description">
<copy todir="${weblogic.autodeploy}" preservelastmodified="true">
<fileset dir="${dist.dir}">
<include name="*.war" />
</fileset>
</copy>
</target>
</project>

 附:JSPc 编译器选项 
使用以下选项的任何组合:

-classpath 
添加组成所需 CLASSPATH 的目录的列表(在 Windows NT/2000 平台上由分号分隔,在 UNIX 平台上由冒号分隔)。包括包含 JSP 所需的任何类的目录。例如(要在一行上输入): 
$ java weblogic.jspc -classpath java/classes.zip;/weblogic/classes.zip myFile.JSP 
-charsetMap 
指定 JSP contentType 指令中使用的 IANA 或非正式字符集名称到 Java 字符集名称的映射。例如: -charsetMap x-sjis=Shift_JIS,x-big5=Big5 
最常用的映射已内置到 JSP 编译器中。仅在未识别出所需的字符集映射时,才使用此选项。 
-commentary 
使 JSP 编译器将来自 JSP 的注释包含在生成的 HTML 页中。如果忽略此选项,则注释不会出现在生成的 HTML 页中。 
-compileAll 
递归编译当前目录中或通过 -webapp 标志指定的目录中的所有 JSP。(请参阅此选项列表中的 -webapp 条目)。还会编译子目录中的 JSP。 
-compileFlags 
将一个或多个命令行标志传递到编译器。将多个标志括在引号中,以空格分隔。例如: java weblogic.jspc -compileFlags "-g -v" myFile.jsp 
-compiler 
指定要用于从生成的 Java 源代码编译类文件的 Java 编译器。使用的默认编译器为 javac。除非您显式指定编译器的绝对路径,否则 Java 编译器程序应位于您的 PATH 中。 
-compilerclass 
将 Java 编译器作为 Java 类(而不是本地可执行文件)运行。 
-d <dir> 
指定已编译输出(即类文件)的目标。将此选项用作将已编译的类放入已位于 CLASSPATH 中的目录的快捷方式。 
-depend 
如果以前为某个 JSP 生成的类文件具有比该 JSP 源文件更新的日期戳,则不会重新编译该 JSP。 
-debug 
在启用调试的情况下进行编译。 
-deprecation 
将源文件编译为类文件时,如果在生成的 Java 源文件中使用了不赞成使用的方法,则会对此做出警告。 
-docroot directory 
请参阅 -webapp。 
-encoding default|named character encoding 
有效参数包括 (a) default,它指定使用 JDK 默认字符编码,(b) 指定的字符编码,如 8859_1。如果未指定 -encoding 标志,则使用字节数组。 
-g 
指示 Java 编译器将调试信息包含在类文件中。 
-help 
显示 JSP 编译器的所有可用标志的列表。 
-J 
获取传递到您的编译器的选项的列表。 
-k 
当使用单个命令编译多个 JSP 时,即使无法编译这些 JSP 中的一个或多个 JSP,编译器也会继续进行编译。 
-keepgenerated 
保留编译过程中作为中间级创建的 Java 源代码文件。通常情况下,这些文件会在编译之后删除。 
-noTryBlocks 
如果 JSP 文件具有许多自定义 JSP 标记或嵌套很深的自定义 JSP 标记,并且您在编译时收到 java.lang.VerifyError 异常,则使用此标志可使 JSP 正确进行编译。 
-nowarn 
从 Java 编译器关闭警告消息。 
-noPrintNulls 
在 JSP 表达式中将“null”显示为“”。 
-O 
在打开优化的情况下编译 Java 源文件。此选项会替换 -g 标志。 
-package packageName 
设置预规划给生成的 Java HTTP Servlet 的包名的包名。默认为 jsp_servlet。 
-superclass classname 
设置由生成的 Servlet 扩展的超类的类名。命名的超类必须是 HttpServlet 或 GenericServlet 的派生。 
-verbose 
将 verbose 标志传递到使用 compiler 标志指定的 Java 编译器。有关详细信息,请参阅编译器文档。默认值为 Off。 
-verboseJavac 
输出由指定的 JSP 编译器生成的消息。 
-version 
输出 JSP 编译器的版本。 
-webapp directory 
展开的目录格式的包含 Web 应用程序的目录名称。如果 JSP 包含对 Web 应用程序中的资源(如 JSP 标记库或其他 Java 类)的引用,则 JSP 编译器将在此目录中查找这些资源。如果在编译需要 Web 应用程序中的资源的 JSP 时省略此标志,则编译将失败。

  

weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中weblogic.jspc预编译JSP的更多相关文章

  1. jsp配置文件数据信息读取

    一.jsp从配置文件*.properties读取信息 <%@ page language="java" import="java.util.*" cont ...

  2. Java实现word文档在线预览,读取office文件

    想要实现word或者其他office文件的在线预览,大部分都是用的两种方式,一种是使用openoffice转换之后再通过其他插件预览,还有一种方式就是通过POI读取内容然后预览. 一.使用openof ...

  3. Atitit.java c#.net php项目中的view复用(jsp,aspx,php的复用)

    Atitit.java c#.net php项目中的view复用(jsp,aspx,php的复用) 1.1. Keyword1 1.2. 前言1 2. Java项目使用.Net的aspx页面view1 ...

  4. 通过预编译头文件来提高C++ Builder的编译速度

    C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...

  5. jsp中的动作元素:<jsp:plugin>

    <jsp:plugin>用来产生客户端浏览器的特别标签(object或embed),可以使用它来插入Applet或JavaBean. 当jsp文件被编译把结果发给浏览器是,<jsp: ...

  6. springboot中tomcat找不到jsp页面【转载】

    这个原理还没搞明白,只知道是内嵌的tomcat找jsp时默认不读取resources目录,但是具体的默认读取的是哪个目录,打了一下午断点我也没找到.... 修改方式,添加配置修改tomcat的读取目录 ...

  7. windows7_下Eclipse中部署tomcat7.0进行JSP+servlet开发

    环境:windows 7+EclipseJava EE IDE for Web Developers +tomcat 7.02 插件:tomcatPluginV321.zip(百度搜索下载即可) 一. ...

  8. struts2中怎么把action中的值传递到jsp页面

    对于如何把struts2的action中的值传到jsp页面中,主要的方法有2种: 使用转发视图利用request域中储存所需的值 使用重定向时存储数据进入session使其在jsp中可以获得 下面,让 ...

  9. struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input

    原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1     function dosearch() {2         if ($(&q ...

随机推荐

  1. python成长之路六-函数的初识

    定义函数 我们现学已知的python函数有<内置函数> 而我们现在要学的是<自定义函数> 1,def  定义一个函数 def name(): # 后接函数名 冒号 pass 2 ...

  2. 自学Aruba4.2-Aruba AC基础配置(1)

    点击返回:自学Aruba之路 自学Aruba4.2-Aruba AC基础配置(1) 管理员登陆(admin/saic_admin): Cli Web 管理帐号 控制器基础设置: 控制器恢复出厂设置 查 ...

  3. BZOJ 400题纪念

    应该是最后一次纪念了吧! 想当年,我可是发过"BZOJ 10题纪念"的人--那时候(一年前?)的自己真的好菜啊,只能说掌握了c++的基础语法的样子.当时觉得省选级别的BZOJ题是世 ...

  4. [luogu1447][bzoj2005][NOI2010]能量采集

    题目大意 求出\(\sum_{i=1}^{n} \sum_{i=1}^{m} gcd(i,j)\times 2 -1\). 题解 解法还是非常的巧妙的,我们考虑容斥原理.我们定义\(f[i]\)表示\ ...

  5. 前端学习 -- Html&Css -- 条件Hack 和属性Hack

    条件Hack 语法: <!--[if <keywords>? IE <version>?]> HTML代码块 <![endif]--> <keyw ...

  6. .net跨防火墙链接oracle连接池链接长时间无通讯数据被断开后报错问题解决

    环境: .net 4.0以上使用Oracle.ManagedDataAccess组件链接oracle数据库,应用程序与数据库之间存在硬件防火墙. 症状:应用程序启动后正常访问,如果出现长时间无数据库请 ...

  7. 使用html5获取当前手机的经纬度,并接入百度地图API,查询出当前位置

    最近项目需要,稍微研究一下html5获取当前地理位置的问题. 获取当前位置的经纬度很简单,一句代码就搞定 navigator.geolocation.getCurrentPosition(functi ...

  8. ASP:连接Access数据库的方法及使用感受

    连接Access的方式有: 方式1: Set conn = Server.Createobject("ADODB.Connection")conn.open "drive ...

  9. ZOJ_3950_How Many Nines 解题报告及如何对程序进行测试修改

    The 17th Zhejiang University Programming Contest Sponsored by TuSimple Solution: #include <stdio. ...

  10. poj3070_斐波那契数列(Fibonacci)

    用矩阵求斐波那契数列,快速幂log(n),只用求最后4位(加和乘的运算中前面的位数无用) #include <stdio.h> #include <stdlib.h> int ...