百度
360搜索
搜狗搜索

struts2教程详解,Struts2的工作原理,简单点说出来详细介绍

本文目录一览: Struts2教程3:struts.xml常用配置解析

   使用<include>标签重用配置文件
  在Struts 中提供了一个默认的struts xml文件 但如果package action interceptors等配置比较多时 都放到一个struts xml文件不太容易维护 因此 就需要将struts xml文件分成多个配置文件 然后在struts xml文件中使用<include>标签引用这些配置文件 这样做的优点如下
  结构更清晰 更容易维护配置信息
  配置文件可以复用 如果在多个Web程序中都使用类似或相同的配置文件 那么可以使用<include>标签来引用这些配置文件 这样可以减少工作量
  假设有一个配置文件 文件名为newstruts xml 代码如下

   <?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><packagename= demo extends= struts default ><actionname= submit  class= action MoreSubmitAction ><resultname= save >/result jsp</result><resultname= print >/result jsp</result></action></package></struts>
  则struts xml引用newstruts xml文件的代码如下
  
  <?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC //ApacheSofareFoundation//DTDStrutsConfiguration //EN dtd ><struts><includefile= newstruts xml /><packagename= test extends= struts default >……</package></struts>

  大家要注意一下 用<include>引用的xml文件也必须是完成的struts 的配置 实际上<include>在引用时是单独解析的xml文件 而不是将被引用的文件插入到struts xml文件中
   action的别名
  在默认情况下 Struts 会调用动作类的execute方法 但有些时候 我们需要在一个动作类中处理不同的动作 也就是用户请求不同的动作时 执行动作类中的不同的方法 为了达到这个目的 可以在<action>标签中通过method方法指定要指行的动作类的方法名 并且需要为不同的动作起不同的名子(也称为别名) 如下面代码所示
  
  <?xmlversion= encoding= UTF ?><!DOCTYPEstrutsPUBLIC  //ApacheSofareFoundation//DTDStrutsConfiguration //EN   dtd ><struts><packagename= demo extends= struts default ><actionname= test  class= action MyAction >……</action><actionname= my  class= action MyAction method= my >……</action></package></struts>

  上面代码的两个动作的class属性都指向同一个类 name为这个类起了两个动作别名 test和my 在动作my中 使用了method属性指定要要运行的方法名为my
  在MyAction类中必须要有my方法 代码如下
  
  packageaction;import opensymphony xwork ActionSupport;publicclassMyActionextendsActionSupport{……publicStringexecute()throwsException{//处理test动作的代码}publicStringmy()throwsException{ //处理my动作的代码}……}

  除了在struts xml中配置别名 还可以通过请求参数来描述指定动作(并不需要在struts xml中配置) 请求参数的格式如下
  //localhost /contextPath/actionName!method action
  关于通过请求指定动作的详细内容 请参阅笔者写的《Struts 教程 处理一个form多个submit》
   为action指定参数
  在struts 中还可以为action指定一个或多个参数 大家还记着struts x是如何设置的action参数不? 在struts x中可以使用<action>标签的parameter属性为其指定一个action参数 如果要指定多个 就只能通过逗号( )或其他的分隔符将不同的参数隔开 而在struts 中可以通过<param>标签指定任意多个参数 代码如下
  
  <actionname= submit  class= action MyAction ><paramname= param >value </param><paramname= param >value </param><resultname= save >/result jsp</result> ……</action>

  当然 在action中读这些参数也非常简单 只需要象获取请求参数一样在action类中定义相应的setter方法即可(一般不用定义getter方法) 如下面的代码将读取param 和param 参数的值
   packageaction;import opensymphony xwork ActionSupport;publicclassMyActionextendsActionSupport{privateStringparam ;privateStringparam ;publicStringexecute()throwsException{System out println(param +param );}publicvoidsetParam (Stringparam ){this param =param ;}publicvoidsetParam (Stringparam ){this param =param ;}……}
  当struts 在调用execute之前 param 和param 的值就已经是相应参数的值了 因此 在execute方法中可以直接使用param 和param
   选择result类型
  在默认时 标签的type属性值是 dispatcher (实际上就是转发 forward) 开发人员可以根据自己的需要指定不同的类型 如redirect stream等 如下面代码所示
  
  <result name= save type= redirect >  /result jsp</result>

  这此result type可以在struts core jar包或struts 源代码中的struts default xml文件中找到 在这个文件中找到<result types>标签 所有的result type都在里面定义了 代码如下
  
  <result types> <result typename= chain class= opensymphony xwork ActionChainResult /> <result typename= dispatcher class= apache struts dispatcher ServletDispatcherResult default= true /> <result typename= freemarker class= apache struts views freemarker FreemarkerResult /> <result typename= header class= apache struts dispatcher HttpHeaderResult /> <result typename= redirect class= apache struts dispatcher ServletRedirectResult /> <result typename= redirectAction class= apache struts dispatcher ServletActionRedirectResult /> <result typename= stream class= apache struts dispatcher StreamResult /> <result typename= velocity class= apache struts dispatcher VelocityResult /> <result typename= xslt class= apache struts views xslt XSLTResult /> <result typename= plainText class= apache struts dispatcher PlainTextResult /> <! DeprecatednameformscheduledforremovalinStruts ThecamelCaseversionsarepreferred Seeww > <result typename= redirect action class= apache struts dispatcher ServletActionRedirectResult /> <result typename= plaintext class= apache struts dispatcher PlainTextResult /></result types>

阅读更多 >>>  linux命令修改占用端口号

   全局result
  有很多时候一个<result>初很多<action>使用 这时可以使用<global results>标签来定义全局的<result> 代码如下
  
  <struts><packagename= demo extends= struts default ><global results><resultname= print >/result jsp</result></global results><actionname= submit class= action MoreSubmitAction > ……</action><actionname= my class= action MoreSubmitAction method= my >……</action></package></struts>

lishixinzhi/Article/program/Java/ky/201311/27860

struts2的主要的具体工作流程

Struts2:
(1)客户端提交一个HttpServletRequest请求(.action或JSP页面)
(2)请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等
(3)FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器
(4)请求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个Request(一般根据URL后缀是否为.action来判断)
(5)如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求交到ActioProxy,由其进行处理.
(6)ActionProxy通过Configuration Manager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action类.
(7)ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用Action,(在调用之前会根据配置文件加载相关的所有Interceptor拦截器)
(8)Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器.
(9) 最后ActionInvocation负责根据struts.xml中配置的result元素,找到与返回值对应的result,决定进行下一步输出.
struts2的主要工作流程是这样的:
首先有一个http请求,会首先进入ActionContextCleanup(清空值栈等,但会留下自己的,比如session,Attribute等),其作用见括号中的
其次,走一些过滤器,filter,然后进入闻名的struts2的总控FilterDispatcher
穿过上述几层后,会进入ActionMapper,来判断此请求是否需要struts2处理,如果需要,那么由ActionProxy来接管,通过配置管理我们可以找到我们的struts.xml,然后进入真正做事的Action
Invocation,依次穿过我们的拦截器,进入action,从而根据返回的result选择我们要的页面,在拦截器的前半部分去值栈中取值通过标签展示在页面上,最后生成response返回,具体的图如下
此图是我自己总结的,颜色比较多的那个图是struts2的官方图片,只是加了注释
struts2说的应用一些,举例,就像我们图中的,当你点击新增按钮后,会触发一个action给web服务器,服务器接受请求,给对应的web容器,根据上下文可以找到我们的webapp应用,找到总的配置文件web.xml,根据里面的配置来判断action谁去处理,找到filter,反射创建类,回调init,读取struts2的配置文件struts.xml,根据命名空间等找到action,反射创建action类实例,回到execute方法,找到对应的result转向下一个页面,其中虚线框中为右图的一个简写

简述开发一个实现STRUTS2框架的程序一般经过什么具体步骤

jsp或者前台页面请求action,之前可以加过滤器,action请求service,service请求dao,dao操作数据库返回的值传给service,service再传给action,页面根据需要是遍历结果集,还是一个跳转,或者其他。
(1)导入struts2的jar
(2)配置web.xml
(3)写一个action 继承actionSupport
(4)在jsp上写一个form访问action。
(5)配置struts.xml 把action配置上

教你如何配置Struts2 web.xml文件

   Struts 的基本配置
  前面大致了解了Struts 框架的基本内容 但这些基本内容都必须建立在Struts 的配置文件基础之上 这些配置文件的配置信息也是Struts 应用的核心部分
   配置Struts web xml文件
  任何MVC框架都需要与Web应用整合 这就不得不借助于Struts web xml文件 只有配置在Struts web xml文件中Servlet才会被应用加载
  通常 所有的MVC框架都需要Web应用加载一个核心控制器 对于Struts 框架而言 需要加载FilterDispatcher 只要Web应用负责加载FilterDispatcher FilterDispatcher将会加载应用的Struts 框架

  因为Struts 将核心控制器设计成Filter 而不是一个普通Servlet 故为了让Web应用加载FilterDispacher 只需要在Struts web xml文件中配置FilterDispatcher即可
  配置FilterDispatcher的代码片段如下
  
  < ! 配置Struts 核心Filter的名字 >struts< /FILTER NAME> < FILTER CLASS> apache struts dispatcher FilterDispatcher < /FILTER CLASS>< INIT PARAM>< ! 配置Struts 框架默认加载的Action包结构 >< PARAM NAME>actionPackages< /PARAM NAME>< PARAM VALUE> apache struts showcase person< /PARAM VALUE>< /INIT PARAM>< ! 配置Struts 框架的配置提供者类 >< INIT PARAM>< PARAM NAME>configProviders < /PARAM NAME>< PARAM VALUE>lee MyConfigurationProvider< /PARAM VALUE>< /INIT PARAM>< /FILTER>
  正如上面看到的 当配置Struts 的FilterDispatcher类时 可以指定一系列的初始化参数 为该Filter配置初始化参数时 其中有 个初始化参数有特殊意义
  config 该参数的值是一个以英文逗号( )隔开的字符串 每个字符串都是一个XML配置文件的位置 Struts 框架将自动加载该属性指定的系列配置文件
  actionPackages 该参数的值也是一个以英文逗号( )隔开的字符串 每个字符串都是一个包空间 Struts 框架将扫描这些包空间下的Action类
  configProviders 如果用户需要实现自己的ConfigurationProvider类 用户可以提供一个或多个实现了ConfigurationProvider接口的类 然后将这些类的类名设置成该属性的值 多个类名之间以英文逗号( )隔开
  除此之外 还可在此处配置Struts 常量 每个 元素配置一个Struts 常量 其中
  子元素指定了常量name 而
  子元素指定了常量value
  提示 关于Struts 常量的讲解 请参阅本书的 节
  在Struts web xml文件中配置了该Filter 还需要配置该Filter拦截的URL 通常 我们让该Filter拦截所有的用户请求 因此使用通配符来配置该Filter拦截的URL
  下面是配置该Filter拦截URL的配置片段
  
  < ! 配置Filter拦截的URL >< FILTER MAPPING>< ! 配置Struts 的核心FilterDispatcher拦截所有用户请求 >< FILTER NAME>struts< /FILTER NAME>/*< /URL PATTERN>< /FILTER MAPPING>

  配置了Struts 的核心FilterDispatcher后 基本完成了Struts 在web xml文件中的配置
  如果Web应用使用了Servlet 以前的规范 因为Web应用不会自动加载Struts 框架的标签文件 因此必须在Struts web xml文件中配置加载Struts 标签库
  配置加载Struts 标签库的配置片段如下
  
  < ! 配置Struts 标签库的URI >/s< /TAGLIB URI>< ! 指定Struts 标签库定义文件的位置 >< TAGLIB LOCATION>/WEB INF/struts tags tld< /TAGLIB LOCATION>< /TAGLIB>

阅读更多 >>>  手机xml编辑器汉化,如何使用文本编辑器打开xml文件啊?

  在上面配置片段中 指定了Struts 标签库配置文件物理位置 /WEB INF/struts tags tld 因此我们必须手动复制Struts 的标签库定义文件 将该文件放置在Web应用的WEB INF路径下
  如果Web应用使用Servlet 以上的规范 则无需在Struts web xml文件中配置标签库定义 因为Servlet 规范会自动加载标签库定义文件
  提示 Struts 的标签库定义文件包含在struts core jar文件里 在struts core jar文件的META INF路径下 包含了一个struts tag tld文件 这个文件就是Struts 的标签库定义文件 Servlet 规范会自动加载该标签库文件 对于Servlet 以上的规范 Web应用自动加载该标签库定义文件 加载struts tag tld标签库定义文件时 该文件的开始部分包含如下代码片段
  
  < TAGLIB>< ! 定义标签库的版本 >< TLIB VERSION> < /TLIB VERSION>< ! 定义标签库所需的JSP版 >< JSP VERSION> < /JSP VERSION>< SHORT NAME>s< /SHORT NAME> /struts tags< /URI> < /TAGLIB>

lishixinzhi/Article/program/Java/ky/201311/28777

Struts2的工作原理,简单点说出来

Struts2流程
1、客户端发送请求
(客户端初始化一个指向Servlet容器(如Tomcat)的请求)
2、请求经过一系列过滤器(如ActionContextCleanUp、SiteMesh等),ActionContextCleanUp-->FilterDispatcher
3、FilterDispatcher通过ActionMapper来决定这个Request需要调用哪个Action
4、如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,
5、ActionProxy通过ConfigurationManager询问Struts配置文件(Struts.xml),找到需要调用的Action类。
6、ActionProxy创建一个ActionInvocation的实例
7、ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用(interceptor)
8、Action执行完毕,ActionInvocation创建Result并返回,返回结果前要做些动作也是可以的

struts2的主要工作流程,处理方式?

请求在Struts2框架中的处理大概分为以下几个步骤:
1 客户端初始化一个指向Servlet容器的请求;
2
这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh
Plugin)
3
接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可
能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2
框架中继承的标签。在这个过程中需要涉及到ActionMapper
给LZ说一下struts2的主要工作流程吧,你可以下载一下他的流程图,首先我们有个请求request进入,会首先走ActionContext Clearup 清空值栈等,但是会留下我们的session和setgetAttribute等,然后会走一下OtherFilter,其他的一些过滤器什么的,然后就会走到我们的filterDispathcer总控,会询问ActionMapping是否此请求需要struts2处理,如果需要,走到ActionProxy代理类,其次,根据ConfigurationManger配置管理找到struts配置文件,然后才是走到真正需要做事的地方,Action Invocation 会依次走我们的拦截器,拦截器走的时候回去值栈中取值,就是通过taglib放到页面上去,走action再走对应result,最后生成相应返回回去。
给LZ两个图吧,第一个图是具体的点击新增按钮后的一系列处理,第二个图是详细的struts2的流程

struts2原理

Struts2的工作原理(工作流程)
其实用最简单的七个步骤:
(1)客户端在浏览器中输入一个url地址;
(2)这个url请求通过http协议发送给tomcat;
(3)Tomcat根据url找到对应项目里面的web.xml文件;
(4)在web.xml里面会发现有struts2的配置;
(5)然后会找到struts2对应的struts.xml配置文件;
(6)根据url解析struts.xml配置文件就会找到对应的class;
(7)调用完class返回一个结果result,根据struts.xml返回到对应的jsp。

如何在eclipse中搭建struts2环境

第一步:打开eclipse,选择Help/Softwareupdates/FindandInstall第二步:选择"Softwareupdates":第三步:点击”add“第四步:选择SelectAlveoleStudioStruts2EditorFeature.第五步:选择install,等待几分钟第六步:重启eclipse生效。
配置步骤:
1、下载并解压struts2。
2、打开Eclipse,建立一个web项目"Text"。
3、在struts2文件包中,找到struts-2.3.12\apps\struts2-blank.war文件,并将其用解压软件解压出来,例如将其解压到桌面的“新建文件夹”中。
4、在解压出的文件中,找到:新建文件夹\WEB-INF\lib\ 下的所有jar包,将其中所有jar包复制到eclipse所建立的Text项目 -- WebContent -- WEB-INF --lib,切记,jar包全部导入到该lib下,不要导错。
5、在解压出的文件中,找到:新建文件夹\WEB-INF\src\java\struts.xml,将该文件复制到第二步eclipse中新建的web项目Text下的src中
6、eclipse的Text项目中,打开struts.xml文件,进行修改,只保留如下内容,修改内容用文字描述不方便
7、在解压出的文件中,找到:新建文件夹\WEB-INF\web.xml ,将该xml文件中的filter内容复制到Eclipse中的web.xml文件中相应位置。
8、eclipse的Text项目中,在WebContent下建立hello.jsp文件,并输入“HelloWorld!!”,保存。
9、右键单击Text项目,选择“Run As”--"Run on Server",运行该项目:
10弹出网站后,会显示404的错误,此时,在地址栏后面输入“hello”或者"hello.action",回车后,即可弹出“HelloWorld!!”。

Struts2简介

   一 什么是Struts ?
  虽然Struts 号称是一个全新的框架 但这仅仅是相对Struts 而言 Struts 与Struts 相比 确实有很多革命性的改进 但它并不是新发布的新框架 而是在另一个赫赫有名的框架 WebWork基础上发展起来的 从某种程度上来讲 Struts 没有继承Struts 的血统 而是继承WebWork的血统 或者说 WebWork衍生出了Struts 而不是Struts 衍生了Struts 因为Struts 是WebWork的升级 而不是一个全新的框架 因此稳定性 性能等各方面都有很好的保证 而且吸收了Struts 和WebWork两者的优势 因此 是一个非常值得期待的框架
  Apache Struts 是一个优雅的 可扩展的JAVA EE web框架 框架设计的目标贯穿整个开发周期 从开发到发布 包括维护的整个过程
  Apache Struts 即是之前大家所熟知的WebWork 在经历了几年的各自发展后 WebWork和Struts社区决定合二为一 也即是Struts
   Struts 和Struts 的不同

   Action 类
  ◆Struts 要求Action类继承一个抽象基类 Struts 的一个普遍问题是使用抽象类编程而不是接口
  ◆Struts Action类可以实现一个Action接口 也可实现其他接口 使可选和定制的服务成为可能 Struts 提供一个ActionSupport基类去实现 常用的接口 Action接口不是必须的 任何有execute标识的POJO对象都可以用作Struts 的Action对象
   线程模式
  ◆Struts Action是单例模式并且必须是线程安全的 因为仅有Action的一个实例来处理所有的请求 单例策略限制了Struts Action能作的事 并且要在开发时特别小心 Action资源必须是线程安全的或同步的
  ◆Struts Action对象为每一个请求产生一个实例 因此没有线程安全问题 (实际上 servlet容器给每个请求产生许多可丢弃的对象 并且不会导致性能和垃圾回收问题)
   Servlet 依赖
  ◆Struts Action 依赖于Servlet API 因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法
  ◆Struts Action不依赖于容器 允许Action脱离容器单独被测试 如果需要 Struts Action仍然可以访问初始的request和response 但是 其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性
   可测性
  ◆测试Struts Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器) 一个第三方扩展——Struts TestCase——提供了一套Struts 的模拟对象(来进行测试)
  ◆Struts Action可以通过初始化 设置属性 调用方法来测试 依赖注入 支持也使测试更容易
   捕获输入
  ◆Struts 使用ActionForm对象捕获输入 所有的ActionForm必须继承一个基类 因为其他JavaBean不能用作ActionForm 开发者经常创建多余的类捕获输入 动态Bean(DynaBeans)可以作为创建传统ActionForm的选择 但是 开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)
  ◆ Struts 直接使用Action属性作为输入属性 消除了对第二个输入对象的需求 输入属性可能是有自己(子)属性的rich对象类型 Action属性能够通过web页面上的taglibs访问 Struts 也支持ActionForm模式 rich对象类型 包括业务对象 能够用作输入/输出对象 这种ModelDriven 特性简化了taglib对POJO输入对象的引用
   表达式语言
  ◆Struts 整合了JSTL 因此使用JSTL EL 这种EL有基本对象图遍历 但是对集合和索引属性的支持很弱
  ◆Struts 可以使用JSTL 但是也支持一个更强大和灵活的表达式语言—— Object Graph Notation Language (OGNL)
   绑定值到页面(view)
  ◆ Struts 使用标准JSP机制把对象绑定到页面中来访问
  ◆Struts 使用 ValueStack 技术 使taglib能够访问值而不需要把你的页面(view)和对象绑定起来 ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)
  类型转换 ◆Struts ActionForm 属性通常都是String类型 Struts 使用Commons Beanutils进行类型转换 每个类一个转换器 对每一个实例来说是不可配置的
  ◆Struts 使用OGNL进行类型转换 提供基本和常用对象的转换器
  校验 ◆Struts 支持在ActionForm的validate方法中手动校验 或者通过Commons Validator的扩展来校验 同一个类可以有不同的校验内容 但不能校验子对象
  ◆Struts 支持通过validate方法和XWork校验框架来进行校验 XWork校验框架使用为属性类类型定义的校验和内容校验 来支持chain校验子属性Action执行的控制 ◆Struts 支持每一个模块有单独的Request Processors(生命周期) 但是模块中的所有Action必须共享相同的生命周期
  ◆Struts 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期 堆栈能够根据需要和不同的Action一起使用
   Struts 的工作流程图
  
   工作流程图
  工作流程当接收到一个request Interceptor做一些拦截或者初始的工作当外部的ervletrequest到来时初始到了servlet容器 传递给一个标准的过滤器链ActionContextCleanUp这个在集成插件方面非常有用Other filters(SitMesh etc)
  调用FilterDispatecher会去查找相应的ActionMapper如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy ActionProxy将会通过ConfigurationManager来查找配置struts xml下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)
  一旦action返回 会查找相应的Result Result类型可以是 jsp或者freeMark 等这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)
lishixinzhi/Article/program/Java/ky/201311/28090

阅读更多 >>>  struts与springmvc,struts框架与mvc是什么关系, struts 们的区别是什么?

网站数据信息

"struts2教程详解,Struts2的工作原理,简单点说出来"浏览人数已经达到20次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:struts2教程详解,Struts2的工作原理,简单点说出来的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!