Sitemesh learning [1]

xiaoxiao2021-03-06  22

Built a composite view using Sitemesh - 2. Decorator Decorator

Establish a composite view using Sitemesh - 1.Hello

Create a composite view using Sitemesh - 2. Decorator <- Now

Establish a composite view using Sitemesh - 3. Other discussion

Decorator Decorator Concept Establish a reuse web application, a general method is to create a hierarchical system, such as one of the following ordinary web applications:

Front end, Front-end: JSP and servlets, or Jakarta's Velocity Control Framework Controller: (struts / webwork) Business logic Business: Main business logic persistence frame: Hibernate / JDO is badly the front-end page logic is difficult Using, when you use an endless include in each page, you will have a problem-repeated code, and each page must be replicated with a page structure with COPY. And when you need a creative changing page structure, the disaster falls in love with you. Sitemesh intercepts Request and Response via Filter and adds a certain decoration to the original page (possibly header, footer ...), then return the result to the client, and the original page is decorated does not know the decoration of Sitemesh, this Differential purposes are also achieved. It is said that the newly introduced portlet specification will help our standards to achieve more Cool ideas than these more Cool ideas, but poor, I still don't understand it is a Shou Dongdong, interested person can study JetSpeed, or JSR (Java) Specification request) 168, but I want Sitemesh so simple, we may wish to use it first. Let's see how to configure the environment In addition to copymesh.jar in Web-INF / LIB, Copy to Web-INF Sitemesh-Decorator.TLD, SiteMesh-Page.TLD file, there are 2 files to establish To web-inf /:

Sitemesh.xml (optional) Decorators.xml sitemesh.xml can set 2 information: Page Parsers: Responsible for reading Stream into a Page object to resolve and operate with Sitemesh. (Not often used, default) Decorator mappers: Different decorative types, I found that two more useful are listed below. A universal mapper, can specify the configuration file name of the decorator, another printable decorator, can allow you to use http: //localhost/aa/a.html? Printable = true to give the original page for printing (lest the header, footer, etc. can also catch the fancy pictures) (but generally do not build it, the default setting is enough: com / opensymphony / module / sitemesh / factory / sitemesh-default.xml): example:

Decorators.xml: Defines the description of all page components constituting the composite view (main structure page, Header, Footer ...), as in the case: *

DefaultDir: Contentd Directory containing the decorator page Page: page file name Name: alias role: role, for secure WebApp: You can specify this file to save the directory patterns: Match the path, you can use *, those accessed, need to be decorated . The most important thing is to write the decorator itself (that is, those to reuse the page, and the structure page). In fact, important work is to make the decorator page itself (that is, a page containing structure and rules), then describes them into Decorators.xml. Let's take a look at the simple use: In fact, the most commonly used simple use is our Hello example, in the face of such a large number of technologies, I want to achieve the function point, there is no need to study too deep (Unless you have a deeper demand). <% @ page contenttype = "text / html; charset = GBK"%>

<% @ Taglib Uri = "SiteMesh-Decorator" prefix = "decorator"%>

<decorator: title default = "Deco Page ... /> </ title></p> <p><Decorator: head /></p> <p></ hEAD></p> <p><body></p> <p>Sitemesh example <HR></p> <p><Decorator: body /></p> <p><hr> chen56@msn.com</p> <p></ body></p> <p></ html></p> <p>We only used 2 labels on the decorator page: <Decorator: title default = "Deco Page ..." />: Insert the title content of the requested raw page into <title> </ title>. <Decorator: body />: Inserts all the contents of the Body of the requested raw page into the corresponding position. Then we add the following description in Decorator.xml: <decorator name = "main" page = "main.jsp"> <pattern> * </ pattern> </ decorator> This will be reproced And follow the format of main.jsp to rendeze in front of you. Let's take a look at more usage. (Plagiarism Sitemesh Document) The following list is listed:</p> <p>Decorator Tagspage Tags is used to create an decorator page. It is used to access the decorator from the original content page. <Decorator: head /> <decorator: body /> <decorator: title /> <decorator: getProperty /> <Decorator: UsePage /> <Page: ApplyDecorator /> <page: Param <Decorator: Head /> Insert the contents of the HEAD tab of the original page (packaged page) (not including the Head tag itself). <Decorator: body /> inserts the contents of the Body tab of the original page (packaged page). <Decorator: Title [Default = "..." /> Insert the contents of the Title tab of the original page (packaged page), and add a default. Example: / _ decorator / main.jsp (Deco): <title> <decorator: title default = "省 h" /> - Additional Title </ title> /aaa.jsp (original page): <title> AAA page </ Title> Access /Aaa.jsp Results: <title> AAA page - Additional title </ title> <decorator: getproperty property = "..." [default = "..."] [ WritentireProperty = "..."] /> Insert the contents of the original tag of the original page (packaged page) at the label, and add a default value. Examples sitemesh document is well understood: The decorator: <body bgcolor = "white" <decorator: getProperty property = "body.onload" writeEntireProperty = "true" / >> The undecorated page: <body onload = "document.someform . Somefield.focus (); ">"> "" online = "document.someform.somefield.focus ();"> Note, WritentireProperty = "TRUE" will join a space before inserting the content . <Decorator: UsePage ID = "..." /> Like the <JSP: UseBean> tag in the JSP page, you can use a page that is packaged as a PAGE object. (Lazy) Example: Use <Decorator: UsePage ID = "Page" />: <% = Page.getTitle ()%></p></div><div class="text-center mt-3 text-grey"> 转载请注明原文地址:https://www.9cbs.com/read-40080.html</div><div class="plugin d-flex justify-content-center mt-3"></div><hr><div class="row"><div class="col-lg-12 text-muted mt-2"><i class="icon-tags mr-2"></i><span class="badge border border-secondary mr-2"><h2 class="h6 mb-0 small"><a class="text-secondary" href="tag-2.html">9cbs</a></h2></span></div></div></div></div><div class="card card-postlist border-white shadow"><div class="card-body"><div class="card-title"><div class="d-flex justify-content-between"><div><b>New Post</b>(<span class="posts">0</span>) </div><div></div></div></div><ul class="postlist list-unstyled"> </ul></div></div><div class="d-none threadlist"><input type="checkbox" name="modtid" value="40080" checked /></div></div></div></div></div><footer class="text-muted small bg-dark py-4 mt-3" id="footer"><div class="container"><div class="row"><div class="col">CopyRight © 2020 All Rights Reserved </div><div class="col text-right">Processed: <b>0.036</b>, SQL: <b>9</b></div></div></div></footer><script src="./lang/en-us/lang.js?2.2.0"></script><script src="view/js/jquery.min.js?2.2.0"></script><script src="view/js/popper.min.js?2.2.0"></script><script src="view/js/bootstrap.min.js?2.2.0"></script><script src="view/js/xiuno.js?2.2.0"></script><script src="view/js/bootstrap-plugin.js?2.2.0"></script><script src="view/js/async.min.js?2.2.0"></script><script src="view/js/form.js?2.2.0"></script><script> var debug = DEBUG = 0; var url_rewrite_on = 1; var url_path = './'; var forumarr = {"1":"Tech"}; var fid = 1; var uid = 0; var gid = 0; xn.options.water_image_url = 'view/img/water-small.png'; </script><script src="view/js/wellcms.js?2.2.0"></script><a class="scroll-to-top rounded" href="javascript:void(0);"><i class="icon-angle-up"></i></a><a class="scroll-to-bottom rounded" href="javascript:void(0);" style="display: inline;"><i class="icon-angle-down"></i></a></body></html><script> var forum_url = 'list-1.html'; var safe_token = 'BuSvFAZPX3M2Klkt7eGJ96hnmHA5Mvzvq1JyhMOqtcwbhAJiGVfaSl0n9KkLhjfQ3tXZ77b5HPcG1v2g'; var body = $('body'); body.on('submit', '#form', function() { var jthis = $(this); var jsubmit = jthis.find('#submit'); jthis.reset(); jsubmit.button('loading'); var postdata = jthis.serializeObject(); $.xpost(jthis.attr('action'), postdata, function(code, message) { if(code == 0) { location.reload(); } else { $.alert(message); jsubmit.button('reset'); } }); return false; }); function resize_image() { var jmessagelist = $('div.message'); var first_width = jmessagelist.width(); jmessagelist.each(function() { var jdiv = $(this); var maxwidth = jdiv.attr('isfirst') ? first_width : jdiv.width(); var jmessage_width = Math.min(jdiv.width(), maxwidth); jdiv.find('img, embed, iframe, video').each(function() { var jimg = $(this); var img_width = this.org_width; var img_height = this.org_height; if(!img_width) { var img_width = jimg.attr('width'); var img_height = jimg.attr('height'); this.org_width = img_width; this.org_height = img_height; } if(img_width > jmessage_width) { if(this.tagName == 'IMG') { jimg.width(jmessage_width); jimg.css('height', 'auto'); jimg.css('cursor', 'pointer'); jimg.on('click', function() { }); } else { jimg.width(jmessage_width); var height = (img_height / img_width) * jimg.width(); jimg.height(height); } } }); }); } function resize_table() { $('div.message').each(function() { var jdiv = $(this); jdiv.find('table').addClass('table').wrap('<div class="table-responsive"></div>'); }); } $(function() { resize_image(); resize_table(); $(window).on('resize', resize_image); }); var jmessage = $('#message'); jmessage.on('focus', function() {if(jmessage.t) { clearTimeout(jmessage.t); jmessage.t = null; } jmessage.css('height', '6rem'); }); jmessage.on('blur', function() {jmessage.t = setTimeout(function() { jmessage.css('height', '2.5rem');}, 1000); }); $('#nav li[data-active="fid-1"]').addClass('active'); </script>