Criticism looks like a feasible expression technology: JavaServerPages Servlet technology

zhaozj2021-02-08  204

JSP technology - is a friend or an enemy? Criticism looks like a feasible expression technology: JavaServerPages Servlet technology

Brett McLaghlin Lutris Technologies's ENHYDRA Strategy October 2000

Content: Historical Potting Prerequisites and Integration Writing and Modifying JSP Content and Representing Designers and Developer Problems Single Processing and Multi-Task Summary Reference Author

As a Java technique, the new ENHYDRA supporter, the author force advises the developer to consider other methods other than JavaServerPages (JSP) servlet when choosing a WEB application. JSP technology is part of Sun's J2EE platform and programming model, which is to solve the problem of how to make a monotonous content into a distinguished representation layer. In fact, Web developers are not unanimously satisfied with JSP technology. Since multiple variants of Sun technology can now be used, you can choose between many representations. This paper explores the JSP coding technology and explores several attractive alternatives.

The technical design is used to convert the plain Latin original web content into content in the attractive representation. JavaServer Pages (JSP) technology, as part of Sun company and part of J2EE platform, has been greatly concerned. It is advantageous to use JSP technology. Web developers should know these pros and cons. They don't have to stick to this technology. In fact, many representations have recently emerged. This article is based on the problem to be solved by the technology, and then examine the unique advantages and weaknesses of the JSP model. Finally, several feasible programs that can replace SUN indications.

Historical grades preceding the detailed background information generated by this technology in a deep interpretation of the technique. Just 10 years ago, the thin client is still a very new term. At that time, we lived in the world of desktop applications, using low-level 286 microprocessors, squinted 14 inches of monitors. But now the time is different, friends! Now, my desktop does not do anything else to run a web browser. We use Sun, IBM, HP, Compaq, and other company's servers to run computing, business logic, and content. That small display? It has been replaced by a large and beautiful 21 inches and 25-inch plasma flat displays. why? Because so we can watch the intricate HTML display, and these HTML display is the front end of powerful applications. The single-tuning interface is no longer able to meet the requirements; now, we want to see gorgeous graphics, moving images, color coordination, no matter which room seems so beautiful, and can be quickly displayed.

Today, ten years later, the Windows application as a prototype has become a history, and we are still facing a huge shift in the method. Tragic Visual Basic and C programmers have found that they can only write a backend system or only for Windows applications, or have added language that provides web feature in their own toolbox, such as Java languages. If you do not support more than three-quarters of ML language (such as HTML, XML, and WML) applications, even if it is not considered to be completely failed, it will be considered very bad. Of course, this shows that we all pay attention to the ability to develop the Web representation layer.

As a result, use new Internet and all our familiar languages ​​(Java, C, Perl, Pascal, ADA, and other languages) are not as easy as we want. There is a lot of problems when the programming language used for each person is used for backend programs and generates a markup that applies to the client. As the browser provides more options (such as DHTML and JavaScript encoding), the increase in the Web field graphics art talents, and the emergence of tools that can use standard HTML to generate complex interfaces, demand for unique user interfaces is better than we develop these applications. The ability to grow in front of the program is still fast. This leads to the rise of technology. Represents technology design to perform a task: convert content (ie, data without displaying details) to representations - you can see all user interfaces you can see in your phone, handheld, or web browser. These representations can solve what problems can I solve? Let's take a look.

The most basic purpose of isolation and integrated representation is to make the content and representation can be separated. In other words, business logic units (possibly written in C or Java language) do not have to generate code to represent specific ways. Data or content is returned in the original form without any format. Thereafter, the technique is shown to add formats or representations for these contents. As a result, the data is surrounded by graphics, format, color, and logo.

Look at the examples in Listing 1 and Listing 2, look at the original content and the difference between the contents of the technique.

Listing 1 shows the original content, in addition to the data, no other things, can be used in a variety of ways.

Listing 1. Only the original content of the data

Russell crowe

Tom Hanks

MEG RYAN

Mary Stuart Masterson

Alec Baldwin

Ashley Judd

Keanu Reeves

Listing 2 is more complicated than the previous list, which shows the same data, but these data packages are shown in the representation technique and can be displayed in a browser that supports HTML.

Listing 2. Data indicating packaging

Search Results: Actor </ Title></p> <p></ HEAD></p> <p><Body></p> <p><H2 align = "center"> Search Results: actor </ h2></p> <p><Center></p> <p><Hr width = "85%"></p> <p><Table width = "50%" cellpadding = "3" cellspacing = "3" border = "1"</p> <p>Bgcolor = "# fffcc"></p> <p><Tr bgcolor = "# ffcccc"></p> <p><Th width = "50%" align = "center"> name </ th></p> <p><Th width = "50%" align = "center"> name </ tH></p> <p></ TR></p> <p><Tr></p> <p><TD Width = "50%> BALDWIN </ TD></p> <p><TD Width = "50%> ALEC </ TD></p> <p></ TR></p> <p><Tr></p> <p><Td width = "50%"> CROWE </ TD></p> <p><Td width = "50%"> Russell </ td> </ TR></p> <p><Tr></p> <p><TD Width = "50%> Hanks </ TD></p> <p><TD Width = "50%> Tom </ TD></p> <p></ TR></p> <p><Tr></p> <p><TD Width = "50%> Judd </ TD></p> <p><TD Width = "50%> Ashley </ TD></p> <p></ TR></p> <p><Tr></p> <p><Td width = "50%> Masterson </ TD></p> <p><TD Width = "50%"> Mary Stuart </ TD></p> <p></ TR></p> <p><Tr></p> <p><TD Width = "50%> Reeves </ TD></p> <p><TD Width = "50%> Keanu </ TD></p> <p></ TR></p> <p><Tr></p> <p><Td width = "50%> ryan </ td></p> <p><TD Width = "50%> MEG </ TD></p> <p></ TR></p> <p></ TABLE></p> <p></ Center></p> <p></ Body></p> <p></ Html></p> <p>The content in Listing 1 is easy to understand, and it is easy to understand. The contents in Listing 2 are dedicated to display in the browser. Extract data from Listing 2, or handle it for other purposes, you need to have some techniques.</p> <p>This basic difference - the process of separating the representation and content rather than integrated (at least when the user does not need this information), it is a premise that the technique (including JSP technology). Further, it does not achieve this basic goal, there is no initial purpose of designing.</p> <p>Preparation and Modification In addition to separating content and representation, it is a modified workload that is exempted by the other factor that indicates whether the technology is useful. Indicates the separation of the content to increase the difference between the character developer's role. The programmer can focus on the original content in the previous example, graphics artists or website administrators can put their energy on the representation. However, some role overlaps in the contents of the artist design or marker and join the programmer-based content.</p> <p>In the simplest case, the artist provides tags, developers to provide code and insert the tag insertion representation. Then, the application "start", the content will become a user interface. Of course, we all know that development work will usually not only end. The next step is to revise and change the interface, and prepare new business rules, which is the place to test the flexibility of technology. Although the raw data in which the update input to the representation is usually not difficult, the graphic artist is difficult to edit their original work. It is common to change the change of the layer (we all have been changing this change). So, now there is such a problem: What should the designers start to change their work? Is it a modified original markup language that they handed over to developers? maybe not. Because the most likely, this page is likely to be inserted into custom tags or code (JSP pages, template engines), which are converted to Java servlet, or have become unrecognizable.</p> <p>Typically, designers must modify them on the original page and give this page to developers again. Developers must turn this page again into representing the specific format used in technology. Otherwise, the designer must learn a scripting language, or at least know which source area in this page is forbidden. Of course, this is an easily error, very dangerous approach. Once you are determined to explicitly separated between technical support content and representation, you should ensure that the change indicates the required modification workload is minimized. JSP technology promises now, let's discuss the specific content of JSP coding. JSP technology is committed to providing designers and developers to provide the most appropriate representations they need. JSP technology is part of the J2EE platform, which shows the most powerful support for Sun Corporation to give Java products. In order to make you have a concept of this solution, you can try to search for "JSP" on Amazon.com, you will find that the books of JSP are more than the books of other Java APIs. . Before I discuss the specific issues of JSP technology, you need to have a clear understanding of its commitment.</p> <p>Content and representation First, JSP technology is used to separate content and representation, this is earliest to appear in a series of targets published by the JSP. In fact, JSP design is directly for developers complaining, these developers are repeatedly turned out to Out.Println ("<html> <head> <title>" PageInfo.gettitle () "</ TITLE>" </ Head> ") is bored. This hardcoded content and mixing of the runtime variable have caused a huge burden on the servlet developers, but also difficult developers are difficult to turn over even minimal changes to the representation.</p> <p>JSP technology changes this situation by supporting normal HTML pages (and later WML or other tag language page) to compile to Java servlets. It is actually imitating out.println () statements without developers write code. It also allows the variables to be inserted into the page until these variables are explained.</p> <p>The JSP page corresponding to the HTML fragment shown in Listing 2 is similar to the example in Listing 3.</p> <p>Listing 3. A JSP page that uses data containing data</p> <p><% @ Page Import = "com.ibm.display.pageutils"%></p> <p><% @ page import = "com.ibm.display.pageinfo"%></p> <p><%</p> <p>PageInfo PageInfo = (pageInfo) session.getattribute ("page_data")</p> <p>%></p> <p><Html></p> <p><HEAD></p> <p><Title></p> <p><% = PageInfo.gettitle ()%></p> <p></ Title></p> <p></ HEAD></p> <p><Body></p> <p><! - Other HTML content -></p> <p></ Body></p> <p></ Html></p> <p>According to these initial principles, JSP technology (at least in its declaration design) will satisfy the first principle of the representation, as described above: that is, the separation of content and representation.</p> <p>The second feature listed in the code and tag JSP technology may cause your attention, that is, JSP encoding allows the Java code to be inserted directly into the tag page. In order to understand the reason for this decision, we recall the situation when developing JSP specifications. Sun and Microsoft's competition has been very intense, mainly from Microsoft Active Server Pages (ASP). JavaServer Pages are similar to the name of Active Server Pages. Moreover, multiple characteristics of the ASP seem to be intentionally. So the JSP author chooses to join the Java code in their tag. As an example of joining Java code in the mark, the JSP segment in Listing 4 automatically adds rows to display each item in the actor vector. Listing 4. Insert Java code in the tag language page</p> <p><% @ Page Import = "com.ibm.display.pageutils"%></p> <p><% @ page import = "com.ibm.display.pageinfo"%></p> <p><% @ Page Import = "com.ibm.people.actor"%></p> <p><% @ Page Import = "java.util.Iterator"%></p> <p><% @ page import = "java.util.vector"%></p> <p><%</p> <p>PageInfo PageInfo = (pageInfo) session.getattribute ("page_data")</p> <p>Vector actors = pageinfo.getactors ()</p> <p>%></p> <p><Html></p> <p><HEAD></p> <p><Title></p> <p><% = PageInfo.gettitle ()%></p> <p></ Title></p> <p></ HEAD></p> <p><Body></p> <p><H2 align = "center"> Search Results: actor </ h2></p> <p><Center></p> <p><Hr width = "85%"></p> <p><Table width = "50%" cellpadding = "3" cellspacing = "3" border = "1"</p> <p>Bgcolor = "# fffcc"></p> <p><%</p> <p>Iterator i = actors.iterator (); I.hasNext ()) {</p> <p>Actor actor = (actor) i.next ();</p> <p>%></p> <p><Tr bgcolor = "# ffcccc"></p> <p><Th width = "50%" align = "center"></p> <p><% = actor.getlastName ()%></p> <p></ TH></p> <p><Th width = "50%" align = "center"></p> <p><% = actor.getfirstname ()%></p> <p></ TH></p> <p></ TR></p> <p><%</p> <p>}</p> <p>%></p> <p></ TABLE></p> <p></ Center></p> <p></ Body></p> <p></ Html></p> <p>Remember, so far, I am the initial goal of designing JSP technology. In the following chapters, I will make my judgment of this goal when I talk about the issue of JSP technology. However, you may have a bit doubtful because embedding code to the JSP page seems to result in a problem associated with the first goal of JSP technology (ie, separate the content and representation). But actually (ace cough), I have not commented. Designers and developers JSP technology is worth mentioning (also worthy of appreciation) the goal is that it tries to establish a clearly defined role during application development. Separation of content and representation on the surface, JSP technology has defined a more obvious boundary between designers and developers. Designers use only standard HTML, WML, or other suitable language to create tags, developers write code. Of course, many designers have learned JavaScript, so it is not surprised that many of them also start learning JSP coding. In many cases, they are not just pure tags, but write a complete JSP page and hand it over to developers. After regular adjustment, the developer places these JSP pages as the front end of a part of the overall application to the appropriate position. But the key is that many designers do not include JSP, so they have work in this environment.</p> <p>I have clearly illustrated a good representation of things that should be provided, as well as specific issues that JSP techniques try to solve. Now, I am ready to cut the topic: JSP technology design although the idea is very good, it brings a lot of questions. Before you choose to use JSP in your application (you may still use), you should know at least the possible defects.</p> <p>You should also understand a small problem that J2EE programming platforms often overlooked: This platform provides an API does not mean you must use it. Just like this sentence, it is a bit stupid. Many developers are still struggling in JSP, EJB or JMS API. They think that if they do not use these APIs, their applications are unlike a true "J2EE application". In fact, many APIs promised to this platform are unnecessary to most applications. If you have problems with JSP technology or have doubts about it, you can do not use it! Please take a closer look at its advantages and disadvantages before choosing JSP technology in your application. Now let's take a look at it.</p> <p>Portability and language locking JSP technology locks you in a specific language. It should not be seen too much for this point. When designing an enterprise application, Java technology is the only language selection (at least my point of view). On this issue, there is no solution to the language. Of course, in this stage of the game, I still don't consider the smoke cigarette and the actual situation of the Microsoft .NET platform. Only time will prove whether the Microsoft .NET platform will develop into a virtually independent product. (I am very doubtful.)</p> <p>Also, choose JSP technology to force you to use Java language, at least in this regard. Although CORBA can be used for business logic, JSP coding does need to be familiar with some servlets and core Java languages. This is usually not a problem because many developers turn to JSP programming from the J2EE platform.</p> <p>Mixing and independence in full text, I mentioned the idea of ​​the content and indicating the content and expressed separately. You may have been annoyed, so now we have to determine if JSP really realizes this goal. As I have said, since JSP claims to be designed for this separation goal, should we assume that it achieves this goal? right? not necessarily.</p> <p>The boundary JSP between the content and the representation allows the Java code to be inserted into the tag language page, which is quite dangerous, and it even allows the content to be mixed into the representation. Worse, business logic often mix into the JSP page, as shown in Listing 5. Listing 5. JSP page containing business logic</p> <p><% @ Page Import = "com.ibm.display.pageutils"%></p> <p><% @ page import = "com.ibm.display.pageinfo"%></p> <p><% @ page import = "com.ibm.logic.adminutils"%></p> <p><% @ Page Import = "com.ibm.people.actor"%></p> <p><% @ Page Import = "java.util.Iterator"%></p> <p><% @ page import = "java.util.vector"%></p> <p><%</p> <p>PageInfo PageInfo = (pageInfo) session.getattribute ("page_data")</p> <p>%></p> <p><Html></p> <p><HEAD></p> <p><Title></p> <p><% = PageInfo.gettitle ()%></p> <p></ Title></p> <p></ HEAD></p> <p><Body></p> <p><H2 align = "center"> Search Results: actor </ h2></p> <p><Center></p> <p><Hr width = "85%"></p> <p><Table width = "50%" cellpadding = "3" cellspacing = "3" border = "1"</p> <p>Bgcolor = "# fffcc"></p> <p><%</p> <p>/ / Perform different searches according to user permissions (business logic!)</p> <p>Vector actors = pageinfo.getactors ()</p> <p>IF (PageInfo.getUserInfo (). Haspermission ("Administrator")) {</p> <p>Actors = adminutils.getactors (pageInfo.getsearchcriteria ());</p> <p>} else {</p> <p>ACTORS = pageInfo.getActors ();</p> <p>}</p> <p>Iterator i = actors.iterator (); I.hasNext ()) {</p> <p>Actor actor = (actor) i.next ();</p> <p>%></p> <p><Tr bgcolor = "# ffcccc"></p> <p><Th width = "50%" align = "center"></p> <p><% = actor.getlastName ()%></p> <p></ TH></p> <p><Th width = "50%" align = "center"></p> <p><% = actor.getfirstname ()%></p> <p></ TH></p> <p></ TR></p> <p><%</p> <p>}</p> <p>%></p> <p></ TABLE></p> <p></ Center></p> <p></ Body></p> <p></ Html></p> <p>JSP supporters will immediately tell you that the JSP tag library can help you avoid this problem. The tag library allows a customized tag to JSP pages (such as <authors />), which interprets the code snippet in the tag library at runtime.</p> <p>The use of custom markers and related tag libraries will make the above examples into the code in Listing 6.</p> <p>Listing 6. Binding to custom tags and tag libraries</p> <p><Center></p> <p><Table width = "50%" cellpadding = "3" cellspacing = "3" border = "1"</p> <p>Bgcolor = "# fffcc"></p> <p><Actors /></p> <p></ TABLE></p> <p></ Center></p> <p>At runtime, the code of this tag will execute, the correct result is inserted into the page. But this did not solve the problem. At this time, the argument for JSP technology is not to indicate whether the content can be separated, but whether they must be separated. As long as the JSP programming allows the embedded code, it is easy to use the embedded code to make the final modification (especially when the deadline is neighboring), not the code is converted to the tag library. If this is not the case, consider the rapid speed of the Java language exceed C and C : Java does not allow many problems in C, such as pointer addition. Although you can always argue in C, it is not necessary to perform a pointer plus, or excellent programmers never insert the code scripTlet, but we all know what the actual situation will be. Java language is better than C because it prohibits this bad habit. But in this case, JSP is extremely similar to the C language, which allows some bad habits.</p> <p>Regarding whether JSP technology has reached the target it claims, there is also a test standard, which is to see if it can actually reach the goal. Of course, JSP is unfair with unlike criteria. Most template engines (such as FreeMarker and Webmacro have this same embedded code feature, usually these templates use language similar to Perl. However, such embedded code is not allowed like ENHYDRA's XMLC. These techniques use a pure tag language page instead of input and generate a Java method. This approach is essentially changing the program stream, not the page (JSP technology) to call the application's logic, the application (Enhydra) use method to affect the value in the page. In the specific case of ENHYDRA, XMLC converts the page into a DOM tree and uses the DOM's HTML binding to allow "domain" in the page. (For more information on ENHYDRA XMLC, see Resources.)</p> <p>At this point, JSP is more serious than XMLC issues. For example, although JSP technology enables its goal, it only allows the tag library. However, the total trend in the Sun specification is always compatible backwards, or at least a long period of time. The current version of JSP 1.1 allows you to use Scriptlet, so it is estimated that the JSP page contains this situation to maintain a few years. Before discussing JSP coding, note that it actually provides the product (which is much more than the pseudo-separation between the user interface and the code of the driver application) and its goals (ie, completely separated content and representation) are still quite Big gap.</p> <p>Single processing and multitasking are discussed above, ideally, designers should only perform single processing, that is, graphical design work, developers should only focus on encoding. In this way, the designer should be able to modify it after a page translates into the format used by the application. In the case of a JSP page, this should be imported into the JavaBean, insert embedded code, and add a custom tag library to the page. The problem is that some designers use HTML editors such as HotMetal, Macromedia Dreamweaver or FrontPage, which cannot identify code scriptlets or tag libraries, means that designers have only received some pages. It can be imagined when the tag library or code segment generates tables in table or other formats. Using an incompatible HTML editor, the designer can't see what the elements look like. JSP coding is not to distinguish between different roles in different roles, but the developer must be able to complete a variety of tasks to become a developer and designer. And bear other roles. Does this important feature not convincing? Then you can download the J2EE reference implementation and transfer any one of the included JSP pages into the HTML editor you came, such as Dreamweaver. This page is immediately filled with yellow zones so that you know all the "illegal" tags included in the page. Of course, the yellow area is caused by JSP tags and code, not any actual errors in the page.</p> <p>So far, there is no editor that can support JSP, I have not heard that some people are working on developing such editor. The template engine also has this same problem, many Java-based programs (such as I like ENHYDRA), allows the tag pages to be submitted to represent technology. In this case, the designer can repeatedly modify the tag page and re-submit them back. The engine or compiler running representation technology can convert this page to the correct format and do not need to change the code (in general). The result is what we hope: designers are designers, and developers are developers.</p> <p>Therefore, compared to the actual functionality provided by JSP technology, I hope you must carefully treat JSP technology proposed commitment. In fact, in order to successfully run in an JSP technology-driven environment, you must have your developer to handle a large number of tags, or learn at least some JSP programming.</p> <p>One of the most vulnerable defects of HTML and XML JSP technology is also the most vulnerable to ignore, that is, it is not compatible with XML. More accurately, especially in the HTML field, JSP page does not need to be compatible with XHTML. XHTML is a World Wide Web Alliance (W3C) specification, which is now replacing HTML 4.0. XHTML defines an HTML tag set according to a structure complete XML document. For example, <br> Mark must be converted to <br /> to ensure compliance with XML regulations. (If you feel that this is not clear, you can check the XML specification and developerWorks About XHTML articles, which are listed in the reference.) Image tags also have similar rules, in XHTML 1.1 (recently born), most digital Properties and other styles are transferred to the CSS style sheet. In addition, most standard HTML documents can be easily converted to XHTML 1.0, which means they can easily read the XML-compatible analysis program, such as Apache Xerces, and can be controlled in XML.</p> <p>You will ask: "What is the most important thing?" The most important thing is that XML quickly became the global standard of Internet and intranet. For any other applications that use the basic XML data processing tool, data is transmitted in XML format, which can easily use the data of your application. Imagine that it is necessary to convert the data into the XML format to communicate with the credit card company! In many cases, your data representation also needs to exchange data with other companies. The most common situation is the portal site application that receives content from different providers (such as weather, stock quotes, news, etc.), which often have markers with providers. However, JSP pages cannot work well in such an environment due to mixing the code and custom tag library. The JSP page is hardly the complete XML document, and it is not necessary to inform XHTML. Because XHTML is a tag language, it does not allow various JSP custom tag libraries. But more importantly, the code snippet inserted into the JSP page is not any form of tag, and once there is another application handles them, the burden of the analysis program is generated.</p> <p>Let me talk about the whole story before you comment on me. If the application allows the original client to calculate the value of the JSP page, the result is pure HTML (or WML, VOXML, etc.). However, most applications for requesting data use certain forms of cache because the round trip on the network is expensive. In these cases, the cached page returns to the old data. In this case, you may want to return the results of the pure XML in all, preferably a static form. But JSP technology is in powerless. The JSP page must always be evaluated at runtime, so you can remove the JSP code scripTlet and tag library.</p> <p>Test: Do you have other expressions to complete this task? The answer is yes. The absolute leader in this area is an Apache Cocoon project, which is completely XML based on XML, which is a XSLT style table application (that is, it can be applied at runtime, or still applied). Since the XML Server Pages are actually an XML document, they are always in accordance with XML. Other techniques that allow pure tag language page entered (eg Tea and Enhydra XMLC) can also allow this, although they don't force this. In these cases, users can use XHTML or standard HTML. But this is still better than JSP, because the format complete XML cannot be static in JSP.</p> <p>Summary I hope that I have widen some of my eyes for you so that you have seen the advantages and disadvantages of JSP technology. Now you can view JSP program as an optional technique in a variety of representations. At this point, you may have doubts about the overall J2EE programming model. Now you may want to further study alternatives to this platform and select an alternative JSP encoding in Apache Cocoon, Enhydra, and multiple templates.</p> <p>Finally, it should be remembered that although this article seems to be opposed, it is not recommended to use or not use JSP. I have no intention to encourage you to deeply explore whether it meets your requirements. The programming model is like an example, sometimes it is, it is time to do. Think twice, find the most suitable for your program and make decisions, this total is better than the grass rate.</p> <p>Have fun, see it online!</p> <p>Reference</p> <p>See the current JSP specification to get all content. Further review the new content in JSP 1.2. Is worried about XML compatibility? You can read specifications and Molly Holzschlag articles Article for DeveloperWorks on Getting Up to Speed ​​to get the details of XHTML. The XML view of the style document is obtained on the W3C Style Center. Need to know the J2EE scheme than providing more features of JSP? Is it an open source code? Please read today's enhydra. Libe your thoughts, look at Apache Cocoon, which is an alternative to another open source using the XSLT to handle the dynamic directory. If you don't mind jump out of Java, the template engine can save you! Two dedicated sites are WebMacro and FreeMarker. About the Author</p> <p>Brett McLaghlin is the ENHYDRA strategist of Lutris Technologies, specializing in distributed system systems. He is the author of Java and XML (O'Reilly); engaged in Java Servlet, Enterprise JavaBeans, XML, and businesses to enterprises. Jaason Hunter has created a JASON Hunter, which provides a simple API for manipulating XML from Java Applications. He is still an Apache Cocoon project, an active developer of the EJBoss EJB server, and is one of the founders of the Apache Turbin project. You can contact Brettt to Brett@newinstance.com.</p></div><div class="text-center mt-3 text-grey"> 转载请注明原文地址:https://www.9cbs.com/read-2974.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="2974" 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.045</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 = 'I4JT4E5aBYF_2Fw98gdZENT8yU_2FQIcI7lO6b2suDZ_2FGr5dNzUuysLmhmhaAJRximL_2F_2FnpBxJ1wTjz2DDI1fTbXHQ_3D_3D'; 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>