对比复习下JSP

1、jsp的本质是Servlet ,会在第一次被访问时会被翻译成一个类文件,从此对这个页面的访问都是由这个类文件执行后进行输出。

   aspx 本质是IHttpHandler

2、jsp模版元素:  页面中书写的Html内容,直接被响应输出到浏览器上。

3、jsp表达式   :  <%= 表达式%> ,  计算出表达式的值后,直接被响应输出到浏览器。

4、jsp脚本片段:  <% 若干语句%>,  在翻译过来的类中,直接被复制黏贴到对应的位置执行。

5、jsp声明 :  <%! 若干java语句%>  在翻译过来的Servlet中会被放置到和Service方法同级的位置,成为类的一个成员。

aspx 中 使用 <script runat='server'></script>或者code-behind(双文件ASP.net页面)实现。

6、jsp注解

<%--注解的内容--%>          被jsp注解注释掉的内容,在jsp翻译引擎将JSP翻译成Servlet的过程中会被丢弃,在翻译过来的Servlet中没有这些信息。

<%//Java注释 %>              属于脚本片段,将被复制到Servlet中,在 .java文件被翻译成 .class 文件时被丢弃。

<!-- html 注解 -->               被当做模板元素,输出到浏览器上。

7、jsp指令:<%@ 指令名称  属性=。。。%>,  为jsp引擎而设计,并不直接产生任何可见输出,而只是告诉引擎如何处理jsp页面中的其余部分。

                     |--  page 指令
                              用于定义JSP页面的各种属性,可位于任何位置,为了可读性,一般位于页面的起始位置
                              <% page
                                         language="java"  
                                         extends="package.class"  
                                         import="java.util.*"        |      "{java.util.*,package.class}"
                                                         默认导入的包(不需要用户导入)有
                                                                java.lang.*,
                                                                javax.servlet.*,
                                                                javax.servlet.jsp.*,
                                                                javax.servlet.http.*
                                         session="true|false"                             // 默认是true
                                         errorPage="relative_url"                      // web.xml 中  <web-app/>下配置  <error-page/>      
                                         isErrorPage="true|false"  
 
                                         pageEncoding="utf-8|iso8859-1|gbk"                                                    
                                                翻译引擎翻译时默认的解码方式是utf-8 (page指令 pageEncoding)
                                         contentType="text/html;charset=utf-8”
                                                服务器默认传输/解析页面文件的编码方式时是使用ISO8859-1  (pageEncoding)
                                                浏览器的默认解码/编码方式是操作系统的默认编码方式  (contentType)
 
                                                 jsp中只要设置过pageEncoding,就不用设置contentType
 
                                         isELIgnored="true|false"
                                             EL表达式是JSP2.0(JAVAEE1.4)的规范中的一门技术。tamcat需要升级到6.0,或者设置本属性 isELIgnored="false"。
                                             
                                        buffer="none|8kb|sizekb"  默认8kb
                                        autoFlush="true|false"        默认true,缓冲区满了后先将满了的数据转入response的缓冲区。false,则如果满了后还写数据,则直接抛异常。
                                              配置out的缓冲区
                             %>
                                
                      |---include指令
                            include指令用于引入其他JSP页面,若果使用Include指令引入了其他JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet
                                 <%request.getRequestDispatcher("/include/head.jsp").include(request,response);%>
                                 <%@include file="/include/head.jsp"%>
                      |---taglib指令
                            用于在JSP页面中导入标签库,自定义标签时使用
 
 8、jsp中九大隐式对象
   page               : Servlet
   config             : ServletConfig
   application      : ServletContext
   request           : HttpRequest
   response        : HttpResponse
   session           : HttpSession
   out                 : 相当于response.getWriter得到的PrintWriter,但不同在于,其本身就有一个缓冲区,
                           利用out写出的内容会先缓冲在out的缓冲区,待满了或整个页面结束了才会转入response的缓冲区。
                            例证:  include指令
           在jsp页面中需要进行数据输出时,不要自己获取response.getWriter,而是要使用out进行输出,防止即用out又用response.getWriter而导致输出顺序错乱的问题
 
   exception      
   pageContext
            (1)可以作为入口对象,获取其他八大隐式对象的引用
                getException方法返回exception隐式对象
                getPage方法返回page隐式对象
                getRequest方法返回request隐式对象
                getResponse方法返回response隐式对象
                getServletConfig方法返回config隐式对象
                getServletContext方法返回application隐式对象
                getSession方法返回session隐式对象
                getOut方法返回out隐式对象
            (2)域对象,四大作用域的入口,可以操作四大作用域中的域属性
               
                作用范围: 当前jsp页面
                生命周期: 当对jsp页面的访问开始时,创建代表当前jsp的PageContext,当对当前jsp页面访问结束时销毁代表当前jsp的pageContext
                作用:在当前jsp中共享数据
               
                    public void setAttribute(java.lang.String name,java.lang.Object value)
                    public java.lang.Object getAttribute(java.lang.String name)
                    public void removeAttribute(java.lang.String name)
 
                    public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
                    public java.lang.Object getAttribute(java.lang.String name,int scope)
                    public void removeAttribute(java.lang.String name,int scope)
                   
                    PageContext.APPLICATION_SCOPE
                    PageContext.SESSION_SCOPE
                    PageContext.REQUEST_SCOPE
                    PageContext.PAGE_SCOPE
 
                    findAttribute方法 -- 搜寻四大作用域中的属性,如果找到则返回该值,如果四大作用域中都找不到则返回一个null,搜寻的顺序是从最小的域开始向最大的域开始寻找
                   
            (3)提供了请求转发和请求包含的快捷方法
                pageContext.include("/index.jsp");
                pageContext.forward("/index.jsp"); 
 
————————————————————————
    3.零散知识
        (1)jsp映射
           <servlet>
                <servlet-name>index</servlet-name>
                <jsp-file>/index.jsp</jsp-file>
          </servlet>
          <servlet-mapping>
                <servlet-name>index</servlet-name>
                <url-pattern>/jsp/*</url-pattern>
         </servlet-mapping>
           
        (2)JSP最佳实践
          JSP作为数据显示模版使用,而servlet做控制器组件。servlet响应请求产生数据,并把数据通过转发技术带给jsp,用jsp显示数据。
            通过自定义标签等技术,实现在JSP中不出现任何JAVA代码。
            
        (3)域的总结
            servletContext (application)
            session (session)
            request (request)
            pageContext
           
            如果一个数据只在当前jsp页面使用,可以使用pageContext域存储
            如果一个数据,除了在当前Servlet中使用,还要在请求转发时带到其他Servlet处理或jsp中显示,这个时候用request域
            如果一个数据,除了现在我自己要用,过一会我自己还要用,存在session域
            如果一个数据,除了现在我自己要用过一会其他人也要用,存在ServletContext域中

ASP.Net Web Form

<%@ Page Language="C#" %> 单页面形式(仅页面呈现文件 xxx.aspx)

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>

website项目中的 双页面形式(页面呈现文件 xxx.aspx, 代码隐藏文件 xxx.aspx.cs)

或 web application项目中 三页面形式(xxx.aspx,xxx.aspx.cs,xxx.aspx.designer.cs)

视图状态

http是无状态协议,asp.net通过__VIEWSTATE 这个隐藏域在多次页面请求直接为asp控件保存状态值。默认情况下ASP.NET中得每个控件都启用了试图状态,所有控件的属性值都保存在这一隐藏域中,每个控件都有个EnableViewState属性,可以禁用该控件的视图状态,也可以用指令禁用页面中的视图状态,或者在web.config中禁用整站的视图状态。

除了视图状态外,.net2.0 另增加了控件状态(Control State)用于保存控件的临界状态值,如GridView使用它保存被选中行的信息,即便视图状态被禁,依然可以记得哪一行被选中。

动态编译

当请求一个asp.net页面时,asp.net framework会检测这个页面对应的.net类,不存在则自动把这个页面编译为一个新类(程序集),保存在\windows\Microsoft.Net\Framework\v2.0.50727\Temporary ASP.NET Files。此后任何对该页面的修改,对应的.net类都会被自动删除,下次请求时再重新编译。与asp页面不同的是,asp.net页面不会在每次被请求时都进行解析和编译。

可以使用aspnet_compiler.exe预编译整个asp.net应用程序,可以避免用户第一次请求页面时的编译延时。

通过CompilationMode属性可以禁用单个页面,一个文件夹下的页面乃至整站的动态编译。当网站有数千个页面,又不愿为每个页面向内存中加载程序集时,禁用编译就很有用处。CompilationMode=Never,页面仅在运行时被解释。其中包含服务端代码(<script runat='server'></script>代码块)的页面不能禁止编译。

双文件Asp.net页面的编译

双文件Asp.net页面的两个部分是部分类和继承关系的联合,部分类的技术是.net2.0后才出现的,在.net1.x中,双文件Asp.net页面的编译生成两个类,分别对应代码隐藏文件和页面呈现文件,二者通过类继承联系在一起。继承是一种单向关系,所有在呈现文件中声明的文件,在父类(代码隐藏文件)中也必需声明,且ID必需一致。否则继承关系将被打断,控件引发的事件将不会被代码隐藏文件处理。

而在2.0后,为了兼容之前的1.x版本,实际编译生成的是3个类。

  1. 一个类对应代码隐藏文件(一个部分类,内容与原xxx.aspx.cs文件一致)。

2. 一个类中包含控件声明,内容类似xxx.aspx.designer.cs文件,同样也是部分类。负责将在子类(xxx.aspx文件)中声明的runat='server'的服务器控件自动在父类中注册一个同名的成员。

public partial class mtdl_Admin_Business : System.Web.SessionState.IRequiresSessionState {

    protected global::ASP.mtdl_mt_title_ascx mt_title;

    protected global::ASP.mtdl_mt_left_ascx mt_left;

    protected global::System.Web.UI.WebControls.LinkButton LinkButton_FB;

    protected global::System.Web.UI.WebControls.LinkButton LinkButton_CX;

    protected global::System.Web.UI.WebControls.Repeater Repeater1;

    protected global::System.Web.UI.HtmlControls.HtmlForm form1;

    protected global::ASP.mtdl_mt_bottom_ascx mt_bottom;

    protected System.Web.Profile.DefaultProfile Profile {
get {
return ((System.Web.Profile.DefaultProfile)(this.Context.Profile));
}
} protected ASP.global_asax ApplicationInstance {
get {
return ((ASP.global_asax)(this.Context.ApplicationInstance));
}
}
}

  2.  最后一个类则由xxx.aspx文件转换而来的子类

namespace ASP
{
[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
public class mtdl_tem_sys_admin_business_aspx : global::mtdl_Admin_Business, System.Web.IHttpHandler
{ private static bool @__initialized; private static object @__stringResource; private static object @__fileDependencies; [System.Diagnostics.DebuggerNonUserCodeAttribute()]
public mtdl_tem_sys_admin_business_aspx()
{
string[] dependencies; ((global::System.Web.UI.Page)(this)).AppRelativeVirtualPath = "~/mtdl/tem_sys/Admin_Business.aspx"; if ((global::ASP.mtdl_tem_sys_admin_business_aspx.@__initialized == false))
{
global::ASP.mtdl_tem_sys_admin_business_aspx.@__stringResource = this.ReadStringResource();
dependencies = new string[10];
dependencies[0] = "~/mtdl/mt_title.ascx.cs";
dependencies[1] = "~/mtdl/mt_title.ascx";
dependencies[2] = "~/mtdl/tem_sys/Admin_Business.aspx.cs";
dependencies[3] = "~/mtdl/mt_iframe_path.ascx.cs";
dependencies[4] = "~/mtdl/mt_iframe_path.ascx";
dependencies[5] = "~/mtdl/mt_bottom.ascx";
dependencies[6] = "~/mtdl/mt_left.ascx";
dependencies[7] = "~/mtdl/mt_bottom.ascx.cs";
dependencies[8] = "~/mtdl/tem_sys/Admin_Business.aspx";
dependencies[9] = "~/mtdl/mt_left.ascx.cs";
global::ASP.mtdl_tem_sys_admin_business_aspx.@__fileDependencies = this.GetWrappedFileDependencies(dependencies);
global::ASP.mtdl_tem_sys_admin_business_aspx.@__initialized = true;
}
this.Server.ScriptTimeout = 30000000;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::ASP.mtdl_mt_title_ascx @__BuildControlmt_title()
{
global::ASP.mtdl_mt_title_ascx @__ctrl;
@__ctrl = new global::ASP.mtdl_mt_title_ascx();
this.mt_title = @__ctrl;
@__ctrl.InitializeAsUserControl(this.Page);
@__ctrl.ID = "mt_title";
return @__ctrl;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::ASP.mtdl_mt_left_ascx @__BuildControlmt_left()
{
global::ASP.mtdl_mt_left_ascx @__ctrl;
@__ctrl = new global::ASP.mtdl_mt_left_ascx();
this.mt_left = @__ctrl;
@__ctrl.InitializeAsUserControl(this.Page);
@__ctrl.ID = "mt_left";
return @__ctrl;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.LinkButton @__BuildControlLinkButton_FB()
{
global::System.Web.UI.WebControls.LinkButton @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.LinkButton();
this.LinkButton_FB = @__ctrl;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "LinkButton_FB";
((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("class", "f");
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("发布"));
@__ctrl.Click += new System.EventHandler(this.LinkButton_FB_Click);
return @__ctrl;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.LinkButton @__BuildControlLinkButton_CX()
{
global::System.Web.UI.WebControls.LinkButton @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.LinkButton();
this.LinkButton_CX = @__ctrl;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "LinkButton_CX";
((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("class", "c");
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("撤销发布"));
@__ctrl.Click += new System.EventHandler(this.LinkButton_CX_Click);
return @__ctrl;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.CheckBox @__BuildControl__control3()
{
global::System.Web.UI.WebControls.CheckBox @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.CheckBox();
@__ctrl.TemplateControl = this;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "chkItem";
return @__ctrl;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.HiddenField @__BuildControl__control4()
{
global::System.Web.UI.WebControls.HiddenField @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.HiddenField();
@__ctrl.TemplateControl = this;
@__ctrl.ID = "infosid";
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBinding__control4);
return @__ctrl;
} public void @__DataBinding__control4(object sender, System.EventArgs e)
{
System.Web.UI.WebControls.HiddenField dataBindingExpressionBuilderTarget;
System.Web.UI.WebControls.RepeaterItem Container;
dataBindingExpressionBuilderTarget = ((System.Web.UI.WebControls.HiddenField)(sender));
Container = ((System.Web.UI.WebControls.RepeaterItem)(dataBindingExpressionBuilderTarget.BindingContainer));
dataBindingExpressionBuilderTarget.Value = global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture);
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.DataBoundLiteralControl @__BuildControl__control5()
{
global::System.Web.UI.DataBoundLiteralControl @__ctrl;
@__ctrl = new global::System.Web.UI.DataBoundLiteralControl(6, 5);
@__ctrl.TemplateControl = this;
@__ctrl.SetStaticString(0, "\r\n </td>\r\n " +
" <td><a style=\"color:#12619D;\" hr" +
"ef=\"javascript:openDetail(\'");
@__ctrl.SetStaticString(1, "\')\"> ");
@__ctrl.SetStaticString(2, "</a></td>\r\n <td> " +
"");
@__ctrl.SetStaticString(3, "</td>\r\n <td align=\"cen" +
"ter\"><a style=\"color:#12619D;\" href=\"Admin_Func.aspx?glid=");
@__ctrl.SetStaticString(4, "\">查看(");
@__ctrl.SetStaticString(5, ")</a></td>\r\n <td>&nbsp" +
";");
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBind__control5);
return @__ctrl;
} public void @__DataBind__control5(object sender, System.EventArgs e)
{
System.Web.UI.WebControls.RepeaterItem Container;
System.Web.UI.DataBoundLiteralControl target;
target = ((System.Web.UI.DataBoundLiteralControl)(sender));
Container = ((System.Web.UI.WebControls.RepeaterItem)(target.BindingContainer));
target.SetDataBoundString(0, global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture));
target.SetDataBoundString(1, global::System.Convert.ToString(Eval("annotation"), global::System.Globalization.CultureInfo.CurrentCulture));
target.SetDataBoundString(2, global::System.Convert.ToString(Eval("name"), global::System.Globalization.CultureInfo.CurrentCulture));
target.SetDataBoundString(3, global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture));
target.SetDataBoundString(4, global::System.Convert.ToString(Eval("num"), global::System.Globalization.CultureInfo.CurrentCulture));
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.DataBoundLiteralControl @__BuildControl__control6()
{
global::System.Web.UI.DataBoundLiteralControl @__ctrl;
@__ctrl = new global::System.Web.UI.DataBoundLiteralControl(4, 3);
@__ctrl.TemplateControl = this;
@__ctrl.SetStaticString(0, "</td>\r\n <td align=\"cen" +
"ter\"><img src=\'");
@__ctrl.SetStaticString(1, "\' /></td>\r\n <td align=" +
"\"center\">");
@__ctrl.SetStaticString(2, "</td>\r\n <td> ");
@__ctrl.SetStaticString(3, "</td>\r\n <td align=\"cen" +
"ter\" >\r\n ");
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBind__control6);
return @__ctrl;
} public void @__DataBind__control6(object sender, System.EventArgs e)
{
System.Web.UI.WebControls.RepeaterItem Container;
System.Web.UI.DataBoundLiteralControl target;
target = ((System.Web.UI.DataBoundLiteralControl)(sender));
Container = ((System.Web.UI.WebControls.RepeaterItem)(target.BindingContainer));
target.SetDataBoundString(0, global::System.Convert.ToString((Eval("n_is_active") + "" == "1" ? "../images/d.gif" : "../images/c.gif"), global::System.Globalization.CultureInfo.CurrentCulture));
target.SetDataBoundString(1, global::System.Convert.ToString(Eval("d_mode_date", "{0:d}"), global::System.Globalization.CultureInfo.CurrentCulture));
target.SetDataBoundString(2, global::System.Convert.ToString(Eval("c_editer"), global::System.Globalization.CultureInfo.CurrentCulture));
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.LinkButton @__BuildControl__control7()
{
global::System.Web.UI.WebControls.LinkButton @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.LinkButton();
@__ctrl.TemplateControl = this;
@__ctrl.ApplyStyleSheetSkin(this);
((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("style", "color:red;");
@__ctrl.OnClientClick = "return confirm(\'确认删除吗?删除后不可恢复!\');";
@__ctrl.CausesValidation = false;
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("删除"));
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBinding__control7);
@__ctrl.Click += new System.EventHandler(this.btnDel_Click);
return @__ctrl;
} public void @__DataBinding__control7(object sender, System.EventArgs e)
{
System.Web.UI.WebControls.LinkButton dataBindingExpressionBuilderTarget;
System.Web.UI.WebControls.RepeaterItem Container;
dataBindingExpressionBuilderTarget = ((System.Web.UI.WebControls.LinkButton)(sender));
Container = ((System.Web.UI.WebControls.RepeaterItem)(dataBindingExpressionBuilderTarget.BindingContainer));
dataBindingExpressionBuilderTarget.CommandName = global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture);
dataBindingExpressionBuilderTarget.Visible = ((bool)(GetCanDelete(Eval("num"))));
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.LinkButton @__BuildControl__control8()
{
global::System.Web.UI.WebControls.LinkButton @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.LinkButton();
@__ctrl.TemplateControl = this;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "LiButton1";
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("<img src=\"../images/s.gif\" alt=\"↑\"/>"));
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBinding__control8);
@__ctrl.Click += new System.EventHandler(this.Sort_Click);
return @__ctrl;
} public void @__DataBinding__control8(object sender, System.EventArgs e)
{
System.Web.UI.WebControls.LinkButton dataBindingExpressionBuilderTarget;
System.Web.UI.WebControls.RepeaterItem Container;
dataBindingExpressionBuilderTarget = ((System.Web.UI.WebControls.LinkButton)(sender));
Container = ((System.Web.UI.WebControls.RepeaterItem)(dataBindingExpressionBuilderTarget.BindingContainer));
dataBindingExpressionBuilderTarget.CommandName = global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture);
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.LinkButton @__BuildControl__control9()
{
global::System.Web.UI.WebControls.LinkButton @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.LinkButton();
@__ctrl.TemplateControl = this;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "LinkButton2";
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("<img src=\"../images/x.gif\" alt=\"↓\"/>"));
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBinding__control9);
@__ctrl.Click += new System.EventHandler(this.Sort_Click);
return @__ctrl;
} public void @__DataBinding__control9(object sender, System.EventArgs e)
{
System.Web.UI.WebControls.LinkButton dataBindingExpressionBuilderTarget;
System.Web.UI.WebControls.RepeaterItem Container;
dataBindingExpressionBuilderTarget = ((System.Web.UI.WebControls.LinkButton)(sender));
Container = ((System.Web.UI.WebControls.RepeaterItem)(dataBindingExpressionBuilderTarget.BindingContainer));
dataBindingExpressionBuilderTarget.CommandName = global::System.Convert.ToString(Eval("id"), global::System.Globalization.CultureInfo.CurrentCulture);
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private void @__BuildControl__control2(System.Web.UI.Control @__ctrl)
{
global::System.Web.UI.WebControls.CheckBox @__ctrl1;
@__ctrl1 = this.@__BuildControl__control3();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(@__ctrl1);
global::System.Web.UI.WebControls.HiddenField @__ctrl2;
@__ctrl2 = this.@__BuildControl__control4();
@__parser.AddParsedSubObject(@__ctrl2);
global::System.Web.UI.DataBoundLiteralControl @__ctrl3;
@__ctrl3 = this.@__BuildControl__control5();
@__parser.AddParsedSubObject(@__ctrl3);
global::System.Web.UI.DataBoundLiteralControl @__ctrl4;
@__ctrl4 = this.@__BuildControl__control6();
@__parser.AddParsedSubObject(@__ctrl4);
global::System.Web.UI.WebControls.LinkButton @__ctrl5;
@__ctrl5 = this.@__BuildControl__control7();
@__parser.AddParsedSubObject(@__ctrl5);
global::System.Web.UI.WebControls.LinkButton @__ctrl6;
@__ctrl6 = this.@__BuildControl__control8();
@__parser.AddParsedSubObject(@__ctrl6);
global::System.Web.UI.WebControls.LinkButton @__ctrl7;
@__ctrl7 = this.@__BuildControl__control9();
@__parser.AddParsedSubObject(@__ctrl7);
@__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.@__Render__control2));
} private void @__Render__control2(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer)
{
this.WriteUTF8ResourceString(@__w, 9226, 390, true);
parameterContainer.Controls[0].RenderControl(@__w);
@__w.Write("\r\n ");
parameterContainer.Controls[1].RenderControl(@__w);
parameterContainer.Controls[2].RenderControl(@__w);
@__w.Write(GetPlatform());
parameterContainer.Controls[3].RenderControl(@__w);
parameterContainer.Controls[4].RenderControl(@__w);
@__w.Write("\r\n </td>\r\n " +
" <td>\r\n " +
" ");
parameterContainer.Controls[5].RenderControl(@__w);
@__w.Write("\r\n ");
parameterContainer.Controls[6].RenderControl(@__w);
@__w.Write("\r\n </td>\r\n " +
" </tr>\r\n " +
" ");
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.WebControls.Repeater @__BuildControlRepeater1()
{
global::System.Web.UI.WebControls.Repeater @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.Repeater();
this.Repeater1 = @__ctrl;
@__ctrl.ItemTemplate = new System.Web.UI.CompiledTemplateBuilder(new System.Web.UI.BuildTemplateMethod(this.@__BuildControl__control2));
@__ctrl.ID = "Repeater1";
return @__ctrl;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::System.Web.UI.HtmlControls.HtmlForm @__BuildControlform1()
{
global::System.Web.UI.HtmlControls.HtmlForm @__ctrl;
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlForm();
this.form1 = @__ctrl;
@__ctrl.ID = "form1";
global::System.Web.UI.WebControls.LinkButton @__ctrl1;
@__ctrl1 = this.@__BuildControlLinkButton_FB();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(@__ctrl1);
global::System.Web.UI.WebControls.LinkButton @__ctrl2;
@__ctrl2 = this.@__BuildControlLinkButton_CX();
@__parser.AddParsedSubObject(@__ctrl2);
global::System.Web.UI.WebControls.Repeater @__ctrl3;
@__ctrl3 = this.@__BuildControlRepeater1();
@__parser.AddParsedSubObject(@__ctrl3);
@__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.@__Renderform1));
return @__ctrl;
} private void @__Renderform1(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer)
{
this.WriteUTF8ResourceString(@__w, 9616, 852, false);
parameterContainer.Controls[0].RenderControl(@__w);
@__w.Write("</li>\r\n <li>");
parameterContainer.Controls[1].RenderControl(@__w);
this.WriteUTF8ResourceString(@__w, 10468, 2885, false);
parameterContainer.Controls[2].RenderControl(@__w);
@__w.Write("\r\n </table>\r\n\r\n " +
" </div>\r\n\r\n ");
if (pagecount > 0)
{
@__w.Write("\r\n <div class=\"fy\">\r\n " +
" <div class=\"fyn\">\r\n " +
" <ul>\r\n "); @__w.Write(pagoutstr); @__w.Write("\r\n </ul>\r\n " +
" </div>\r\n </div>\r\n " +
" "); } @__w.Write("\r\n </td>\r\n </tr" +
">\r\n </table>\r\n </td>\r\n " +
" </tr>\r\n </tbody>\r\n </table>\r\n ");
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private global::ASP.mtdl_mt_bottom_ascx @__BuildControlmt_bottom()
{
global::ASP.mtdl_mt_bottom_ascx @__ctrl;
@__ctrl = new global::ASP.mtdl_mt_bottom_ascx();
this.mt_bottom = @__ctrl;
@__ctrl.InitializeAsUserControl(this.Page);
@__ctrl.ID = "mt_bottom";
return @__ctrl;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
private void @__BuildControlTree(mtdl_tem_sys_admin_business_aspx @__ctrl)
{
@__ctrl.EnableViewStateMac = false;
this.InitializeCulture();
global::ASP.mtdl_mt_title_ascx @__ctrl1;
@__ctrl1 = this.@__BuildControlmt_title();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(@__ctrl1);
global::ASP.mtdl_mt_left_ascx @__ctrl2;
@__ctrl2 = this.@__BuildControlmt_left();
@__parser.AddParsedSubObject(@__ctrl2);
global::System.Web.UI.HtmlControls.HtmlForm @__ctrl3;
@__ctrl3 = this.@__BuildControlform1();
@__parser.AddParsedSubObject(@__ctrl3);
global::ASP.mtdl_mt_bottom_ascx @__ctrl4;
@__ctrl4 = this.@__BuildControlmt_bottom();
@__parser.AddParsedSubObject(@__ctrl4);
@__ctrl.SetRenderMethodDelegate(new System.Web.UI.RenderMethod(this.@__Render__control1));
} private void @__Render__control1(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer)
{
this.WriteUTF8ResourceString(@__w, 13353, 875, false);
@__w.Write(glid);
this.WriteUTF8ResourceString(@__w, 14228, 463, false);
parameterContainer.Controls[0].RenderControl(@__w);
@__w.Write("\r\n ");
parameterContainer.Controls[1].RenderControl(@__w);
@__w.Write("\r\n <div id=\"mtcontainer\" class=\"container_scroll\">\r\n ");
parameterContainer.Controls[2].RenderControl(@__w);
@__w.Write("\r\n </div>\r\n ");
parameterContainer.Controls[3].RenderControl(@__w);
@__w.Write("\r\n</body>\r\n</html>");
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
protected override void FrameworkInitialize()
{
base.FrameworkInitialize();
this.SetStringResourcePointer(global::ASP.mtdl_tem_sys_admin_business_aspx.@__stringResource, 0);
this.@__BuildControlTree(this);
this.AddWrappedFileDependencies(global::ASP.mtdl_tem_sys_admin_business_aspx.@__fileDependencies);
this.Request.ValidateInput();
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
public override int GetTypeHashCode()
{
return -1338025651;
} [System.Diagnostics.DebuggerNonUserCodeAttribute()]
public override void ProcessRequest(System.Web.HttpContext context)
{
base.ProcessRequest(context);
}
}
}

eg:

  

若干页面一组,会被编译为一个dll,并自动匹配了一个简单工厂

//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.17929
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------ [assembly: System.CodeDom.Compiler.GeneratedCodeAttribute("ASP.NET", "4.0.30319.17929")]
[assembly: System.Security.SecurityRulesAttribute(System.Security.SecurityRuleSet.Level2)]
[assembly: System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0")] namespace @__ASP { internal class FastObjectFactory_app_web_1x3iilvw { #line 1 "c:\\dummy.txt" #line default
#line hidden private FastObjectFactory_app_web_1x3iilvw() {
} static object Create_ASP_mtdl_tem_sys_admin_business_add_aspx() {
return new ASP.mtdl_tem_sys_admin_business_add_aspx();
} static object Create_ASP_mtdl_tem_sys_managerlevel_aspx() {
return new ASP.mtdl_tem_sys_managerlevel_aspx();
} static object Create_ASP_mtdl_tem_sys_admin_role_aspx() {
return new ASP.mtdl_tem_sys_admin_role_aspx();
} static object Create_ASP_mtdl_tem_sys_admin_config_aspx() {
return new ASP.mtdl_tem_sys_admin_config_aspx();
} static object Create_ASP_mtdl_tem_sys_admin_business_aspx() {
return new ASP.mtdl_tem_sys_admin_business_aspx();
}
}
}

 

也包括App_Code文件夹下的类(App_Code没有匹配实例化工厂), global.asax文件也是一样的处理方式

控件树

生成的类继承自System.Web.UI.Page,asp.net framework 调用 void ProcessRequest(System.Web.HttpContext context)方法显示页面,这个方法构建页面的控件树。

控件树的根节点是Page本身,asp.net页面中的所有元素都会被转换到.net类中,其中html和纯文本用LiteralControl呈现,可以用FindControl(ID)查找控件。

页面执行生命周期

public partial class Default2 : System.Web.UI.Page
{
protected int i = 1; protected void Page_PreInit(object sender, EventArgs e)
{
Response.Write(i + ".PreInit:当页面初始化开始时发生");
i++;
Response.Write("<br>");
} protected void Page_Init(object sender, EventArgs e)
{
Response.Write(i + ".Init:当页面初始化时发生");
i++;
Response.Write("<br>");
} protected void Page_InitComplete(object sender, EventArgs e)
{
Response.Write(i + ".InitComplete:当页初始化完成时发生");
i++;
Response.Write("<br>");
} protected void Page_PreLoad(object sender, EventArgs e)
{
Response.Write(i + ".PreLoad:当页load事件前发生");
i++;
Response.Write("<br>");
} protected void Page_Load(object sender, EventArgs e)
{
Response.Write(i + ".Load:当服务器控件加载到Page对象中时发生(加载页面时)");
i++;
Response.Write("<br>"); //在Load和LoadComplete之间会执行控件事件.
//如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
} protected void Page_LoadComplete(object sender, EventArgs e)
{
Response.Write(i + ".LoadComplete:当页面生命周期的加载阶段结束时发生");
i++;
Response.Write("<br>");
} protected void Page_PreRender(object sender, EventArgs e)
{
Response.Write(i + ".PreRender:当页加载控件之后,呈现之前发生,使用该事件对页或其控件的内容进行最后更改(预呈现)");
i++;
Response.Write("<br>");
} protected void Page_PreRenderComplete(object sender, EventArgs e)
{
Response.Write(i + ".PreRenderComplete:呈现内容前发生.(预呈现完成)");
i++;
Response.Write("<br>");
} protected void Page_SaveStateComplete(object sender, EventArgs e)
{
/*网页上控件的状态信息是在 PreRenderComplete 事件后保存的。
在SaveStateComplete事件之前用Trace查看页时其实在该事件前还有
一个SaveState事件,只是这里无法演示. 注意:SaveStateComplete 事件在将页和页上控件的视图状态和控件状态保存到持久性介质之后引发。
这是在页被呈现到请求浏览器之前引发的最后一个事件。*/ Response.Write(i + ".SaveStateComplete:在页已完成对页和页上控件的所有视图状态和控件状态信息的保存后发生.");
i++;
Response.Write("<br>"); /*最后一部操作
呈现:Render:
它不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法Render()。
所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。*/ /*当你关闭页面的时候就会引发UnLoad(当服务器控件从内存中卸载时发生)
和Disposed两事件(当从内存释放服务器控件时发生,这是服务器控件生存期的最后阶段) 首先加载UnLoad事件:卸载页面:完全呈现页、将页发送至客户端并准备丢弃时,
将调用卸载。此时,将卸载页属性(如Response和Request)并执行清理. 最后加载Disposed事件,释放资源,生命周期结束....
*/
}
}

一般最常操作的是Page_Load 和Page_PreRender,二者区别在于前者发生在所有控件事件之前,后者发生在所有控件事件之后

asp.net页面默认开启了AutoEventWireup

从浏览器页面触发的事件不能立刻在本地得到处理,而是POST至服务器上,因此,Asp.NET建立了委托(代理)机制。在建立一个事件的同时,建立相应的委托:

private void InitializeComponent()
{    
    this.mybutton.Click += new System.EventHandler(this.Button1_Click);//委托
}

ASP.NET 页框架支持以自动方式将页事件与方法相关联。如果 Page 指令的 AutoEventWireup 属性被设置为 true,该页框架将自动调用页事件,即 Page_Init 和 Page_Load 等方法。在这种情况下,不需要任何显式的 Handles 子句或委托。
如果将 AutoEventWireup 设置为 true,Visual Studio 将生成用于绑定事件的代码,页框架将自动基于事件的名称来调用事件。

开发人员可以利用该参数避免编写过多的链接代码。如果该属性设置为"false",则代码应改为:

private void InitializeComponent()
{    
    this.mybutton.Click += new System.EventHandler(this.Button1_Click);//委托
    this.Load += new System.EventHandler(this.Page_Load);//可以用AutoEventWireup属性避免的委托
}

但大部分情况下,页面不需要关联如此多的特殊事件,会增加额外的操作和系统开销。同时, ASP.NET 页框架自动调用事件处理的方法基于其预定名称,这会导致到相同事件处理方法当页运行被调用两次,也会增大系统开销。因此,Microsoft 建议始终将 AutoEventWireup 设置为 FALSE。同样 AutoEventWireup 并不能对所有页面事件有效,比如Page_InitComplete()事件就不支持它。

调试

指令Dedug="true"

调试位于远程服务器端的asp.net应用程序时,还要禁掉自定义错误<compilation Dedug="true" /><customErrors mode="off"/>

为页面或应用程序启用调试,调试模式下编译器不会进行某些性能优化,所以正式运营前要确认禁用了调试

System.Web部分中增加 <deployment retail="true"/>: 禁调试默认,允许远程自定义错误并禁止跟踪。

跟踪页面执行Trace="true"

当想要输出页面执行的跟踪信息,就要为页面或整个程序启用跟踪

当<%@ Page %>指令包含Trace="true"属性时,这个属性启用跟踪并将跟踪信息附在页面的底部。

可以在代码的任意位置 主动调用Trace.Warn()方法添加一条跟踪信息到跟踪信息区,所以可以用跟踪来诊断页面的错误

页面跟踪的缺点是任何人都能看到跟踪信息。

程序级跟踪

web.config :

<configuration>

<system.net>

<trace enabled="true" localOnly="false"  writeToDiagnosticsTrace="true"   mostRecent="true"/>

</system.net>

</configuration>

启用程序级跟踪后,只在访问特殊页面Trace.axd时才会显示跟踪信息(显示启用程序级跟踪后的10次页面请求)

远程服务端需要为trace节点 添加localOnly="false"属性,就算禁用了页面级跟踪,用Trace.Warn()所写的信息也可以通过Trace.axd查看。

使用writeToDiagnosticsTrace属性可以把所有跟踪信息输出到Visual Web Developer的输出窗口

使用mostRecent属性可以显示最新的10次页面请求,而不启用这一属性,那么在10次页面请求后,跟踪将自动停止。

通过添加断点

这个只适用于本地调试

ASP.Net Web Form<一> aspx文件编译及呈现的更多相关文章

  1. Asp.net web form url route使用总结

    asp.net web form 使用URL路由 注不是mvc中的路由 一.前台控件使用路由,通过表达式生成url地址,注意给路由参数赋值,防止使用了其他路由表达式值方式1:<asp:Hyper ...

  2. ASP.NET Web Form和MVC中防止F5刷新引起的重复提交问题

    转载 http://www.cnblogs.com/hiteddy/archive/2012/03/29/Prevent_Resubmit_When_Refresh_Reload_In_ASP_NET ...

  3. 在asp.net web form项目中添加webapi接口

    我有一个支付宝服务网关是ASP.NET WEB FORM项目,但是最近这个网关需要对外提供几个接口,想了下,使用web api比较合适,实现很简单,GO 1,首先添加一个文件夹名字叫App_Start ...

  4. ASP.NET Web API实践系列01,以ASP.NET Web Form方式寄宿

    创建一个空的ASP.NET Web Form项目. 右键项目,添加新项,创建Web API控制器类,TestController. 删除掉TestController默认的内容,编写如下: using ...

  5. ASP.NET Web网站中App_Code文件夹的作用及使用场景

    原文地址:Web Site项目和ASP.NET Web Application中App_Code文件夹的作用作者:宾的宾 我现在要建一个ASP.NET的网站了,不难吧,开始动手.如下图: 这种方法建立 ...

  6. 添加asp.net mvc到现有的asp.net web form 应用程序

    前言 asp.net mvc的前一版本为asp.net web Form(Asp.net mvc之前称为asp.net),其第一个版本与2002年年初发布.asp.net web form 属于.ne ...

  7. 关于asp.net web form 和 asp.net mvc 的区别

    asp.net web forms 有什么缺陷? 1.视图状态臃肿:服务器和客户端传输过程中包含了大量的试图状态——在现在的web程序中甚至多达几百kb,而且每次往返都会请求,导致服务器请求带宽增加, ...

  8. ASP.NET(Web Form)绘制图表 -- Google Chart 三部曲

    ASP.NET(Web Form)绘制图表 -- Google Chart 三部曲 ASP.NET(Web Form)绘制图表 -- Google Chart 三部曲 1.  网页绘制图表 Googl ...

  9. ASP.NET MVC与ASP.NET Web Form简单区别与适用场景

    概论: Asp.net  微软 提供web开发框架或者技术.分Web Form和ASP.NET MVC.下面简单说明各自优缺点及使用场景. Web Form 优点: 1.支持丰富的服务器控件.如:Gr ...

随机推荐

  1. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

  2. CF722C. Destroying Array[并查集 离线]

    链接:Destroying Array C. Destroying Array time limit per test 1 second memory limit per test 256 megab ...

  3. HDU4003Find Metal Mineral[树形DP 分组背包]

    Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Other ...

  4. java list

    List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引 ArrayList:底层的数据结构使用的是数组结构(数组长度是可变 ...

  5. UIScrollView解决无法触发手势

    //创建一个分类 //.h #import <UIKit/UIKit.h> @interface UIScrollView (Touch) - (void)touchesBegan:(NS ...

  6. 用nodejs搭建一个简单的服务器

    使用nodejs搭建一个简单的服务器 nodejs优点:性能高(读写文件) 数据操作能力强 官网:www.nodejs.org 验证是否安装成功:cmd命令行中输入node -v 如果显示版本号表示安 ...

  7. 005商城项目:ssm框架的整合成功之后的问题:使用maven的tomcat插件时的debug

    在执行maven的clean时经常碰到一个问题: 解决: 然后: 还有一个问题是:用maven 使用Debug调试时,不能看到源代码. 解决办法: 下面选择Debug Configurations 这 ...

  8. ios开发--多台电脑共用一个开发证书的方法

    Xcode5 以前的操作步骤是: idp证书如何给另一台机子使用 先在原电脑上用Xcode->Windows->Organizer, 再点击Developer profile, 在其最下面 ...

  9. java:多线程基础之Runnable、Callable与Thread

    java.lang包下有二个非常有用的东西:Runnable接口与Thread类,Thread实现了Runnable接口(可以认为Thread是Runnable的子类),利用它们可以实现最基本的多线程 ...

  10. 使用 data-* 属性来嵌入自定义数据

    1. HTML 实例 <ul> <li data-animal-type="bird">Owl</li> <li data-animal- ...