Matt RaibleMatt Raible is a writer with a passion for software. Connect with him on LinkedIn.

The Angular Mini-Book The Angular Mini-Book is a guide to getting started with Angular. You'll learn how to develop a bare-bones application, test it, and deploy it. Then you'll move on to adding Bootstrap, Angular Material, continuous integration, and authentication.

Spring Boot is a popular framework for building REST APIs. You'll learn how to integrate Angular with Spring Boot and use security best practices like HTTPS and a content security policy.

For book updates, follow @angular_book on Twitter.

The JHipster Mini-Book The JHipster Mini-Book is a guide to getting started with hip technologies today: Angular, Bootstrap, and Spring Boot. All of these frameworks are wrapped up in an easy-to-use project called JHipster.

This book shows you how to build an app with JHipster, and guides you through the plethora of tools, techniques and options you can use. Furthermore, it explains the UI and API building blocks so you understand the underpinnings of your great application.

For book updates, follow @jhipster-book on Twitter.

10+ YEARS


Over 10 years ago, I wrote my first blog post. Since then, I've authored books, had kids, traveled the world, found Trish and blogged about it all.
You searched this site for "young russian teenboy model pre teen". 788 entries found.

You can also try this same search on Google.

512 MB is not enough for Java Development

At least not on my PowerBook (1.33 GHz) - good thing another 512 is on the way!

Load Avg:  0.98, 0.98, 0.98     CPU usage:  20.9% user, 17.8% sys, 61.2% idle                       
SharedLibs: num =   81, resident = 18.4M code, 1.27M data, 2.78M LinkEdit                           
MemRegions: num = 11097, resident =  295M + 4.59M private,  116M shared                             
PhysMem:  63.3M wired,  291M active,  149M inactive,  504M used, 8.28M free

Posted in Mac OS X at Oct 15 2003, 01:35:53 PM MDT 3 Comments

Skinning your applications and Apache+Tomcat on RH9

Here are a couple of links I found on mailing lists that might be of use:

  • Xkins: Xkins framework uses Velocity to process snippets of HTML, but you can use any other template processor (Xkins comes with it's own default processor). Xkins also comes with Forms Tag Libs, that allows you to create forms using Xkins and comes with four Skins. Xkins Forms integrates with Struts framework. Xkins also fits perfect in JSF world, playing a role as a RenderKit, and can work with other presentation frameworks, (i.e. struts-layout).I'll stick with simple XHTML and CSS. If I need different layouts (HTML), I'll use a different base tile.
  • John Turner has published a Tomcat 4.1.27 + Apache 2.0.47 HowTo. This is similar to mine, but looks much cleaner and to the point.

Later: I discovered the beauty of John's HowTo this evening. It allows you to specify one measly line in Apache's httpd.conf file and only a few lines in Tomcat's server.xml file and viola Tomcat configures itself! It sets up aliases and such for each webapp that you have deployed. As an example, here's dynamically created section for AppFuse:

#################### localhost:/appfuse ####################                                       
                                                                                                       
# Static files                                                                                     
Alias /appfuse "/opt/dev/tools/jakarta-tomcat-4.1.27/webapps/appfuse"                              
                                                                                                       
<Directory "/opt/dev/tools/jakarta-tomcat-4.1.27/webapps/appfuse">                         
    Options Indexes FollowSymLinks                                                                 
    DirectoryIndex index.jsp                                                                       
</Directory>                                                                                  

# Deny direct access to WEB-INF and META-INF                                                       
#                                                                                                  
<Location "/appfuse/WEB-INF/*">                                                                 
    AllowOverride None                                                                             
    deny from all                                                                                  
</Location>                                                                                 
                                                                                                       
<Location "/appfuse/META-INF/*">                                                              
    AllowOverride None                                                                             
    deny from all                                                                                  
</Location>                                                                                   
                                                                                                       
JkMount /appfuse/j_security_check  ajp13                                                           
JkMount /appfuse/auth/*  ajp13                                                                     
JkMount /appfuse/register/*  ajp13                                                                 
JkMount /appfuse/passwordHint/*  ajp13                                                             
JkMount /appfuse/*.do  ajp13                                                                       
JkMount /appfuse/*.jsp  ajp13                                  

I had all of this working great - I even had Apache upgraded to 2.0.47 on OS X (serving localhost/~user files and everything)! And then I rebooted... Now in catalina.out, I'm getting the following - ugh...

BAD packet 256                                                                                      
In: : [B@c283b5 4/843                                                                               
01 00 03 47 00 00 00 00 00 00 00 00 00 00 00 00  | ...G............                                 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  | ................ 

WTF?!

Solved: I got this solved fairly easily. I had modified /usr/sbin/apachectl so that the HTTPD variable pointed to /usr/local/apache2/bin/httpd rather than /usr/sbin/httpd. I fixed it by removing /usr/bin/apachectl and executing "ln -s /usr/local/apache2/bin/apachectl /usr/sbin/apachectl". Now if I could only get the Rendezvous mod working on 2.0.x.

Posted in Java at Oct 14 2003, 08:09:07 AM MDT 2 Comments

Precompile your JSPs for Tomcat 4.x

Filip Hanik has provided a nice Ant script for pre-compiling JSPs. Its designed to be run after you've deployed your application to Tomcat. On my current project, it took 1 minute 30 seconds to compile all our JSPs - making it a candidate for new QA and Production deployments only. I'll be adding this to AppFuse's next release and verifying it actually works before I release. I know the compile works, but I want to make sure that my .java and .class files aren't rebuilt the first time I hit a JSP (I've seen this before). Also, you might want to checkout my issues if you run into problems.

Update: I've verified that this really does work - Sweet!

Posted in Java at Oct 09 2003, 03:41:47 PM MDT 3 Comments

Dynamic Queries with Hibernate

I have a client that wants the ability to search on all columns in all tables in their database. So far, I've been able to get all the columns, and their friendly labels by getting all the *Form.* keys in my ApplicationResources.properties file. I still need to sort them alphabetically, but that's another issue. Now I have the following UI pretty much done:

I'm happy with the UI, but I'm struggling with getting Hibernate to return my desired results. I'm able to dynamically select the table/column to search on because of values in my "tables/columns" drop-down. However, many of these tables have Id fields - for status fields, type fields, etc. (basically drop-downs). When searching, this is a pain because users are likely to search on "Active" rather than "1". Because of this, my first issue is how do I make the status field's friendly name a part of my POJO (with Hibernate)?

My 2nd issue is regarding Hibernate's Expression API. I want to be able to pass in the criteria (=, contains, <, >), propertyName and value and get my results. However, it seems that the second half of the comparison must be the same datatype as the field. This means if you're searching on "contract amount", and its a Double, I need to do a Double.valueOf(searchTerm). Basically, I'm looking for an easy way to do this:

  Criteria filter = ses.createCriteria(clazz); 
  
  // determine type of expression - I'd love to figure 
  // out a cleaner way to do this but there's only 
  // 5 possible types, so I don't mind typing the 5
  // if statements
  if (expression.equals("=")) { 
    // How do I convert these to the fields' type at run-time?
    // Sure I could do a bunch of if statements again, but it seems ugly.
    filter.add(Expression.eq(field, Double.valueOf(value))); 
  }
 
  List results = filter.list();

Any advice is appreciated - especially considering I estimated this task to take 4-5 hours and I'm going on 8.

Posted in Java at Oct 05 2003, 10:39:29 AM MDT 11 Comments

Simple "workaround" for exporting with the displaytag using Tiles

I figured out an easy "workaround" to the fact that the displaytag's export feature (to XML, CSV, and Excel) doesn't work when using Tiles. The happens because the response has already been committed by Tiles (when including previous JSPs) and the displaytag is unable to set the contentType. Here's my workaround:

In struts-config.xml, create a local forward that goes directly to the JSP:

  <forward name="exportList" path="/WEB-INF/pages/userList.jsp"/>

Then in your Action, add a little logic to see if you should forward to the definition or to the list:

  // if exportType is a parameter, forward directly to JSP
  if (request.getParameter("exportType") != null) {
    if (log.isDebugEnabled()) {
      log.debug("export detected, forwarding directly to list jsp");
    }

    return mapping.findForward("exportList");
  } else {
    // return a forward to the user list definition
    return mapping.findForward("list");
  }

Tested with displaytag 0.8.5 on Windows XP and Tomcat 4.1.27. Enjoy!

Update: This workaround will not work with displaytag 1.0b1. There is another solution using a Filter, so we'll try to incorporate that into the 1.0 release.

Posted in Java at Oct 02 2003, 09:58:41 PM MDT 1 Comment

Struts tip o' the day ~ using bean:size

A co-worker turned me on to this one today - you can use <bean-el:size collection="${myForm.list}" id="listSize"/> to get the size of a collection and expose it as a pageContext variable. I've been looking for this sucker for years! Usually, I end up putting a getListSize() getter on my form to accomplish this, since none of the other tags (including JSTL) allow you to get the size of a collection.

Posted in Java at Sep 30 2003, 07:25:59 PM MDT 6 Comments

Tomcat Service Manager for Windows

If you run Tomcat as a service (on Windows), you might be interested in the Tomcat Service Manager. I don't, so I'm not - I prefer "tstart" and "tstop" in cygwin (or bash), which are defined in my .bashrc file as:

alias tstart=$CATALINA_HOME/bin/startup.bat
alias tstop=$CATALINA_HOME/bin/shutdown.bat

NOTE: If you are unfortunate enough to have $CATALINA_HOME defined as a directory with spaces in it, you'll need to wrap $CATALINA_HOME in double quotes.

Posted in Java at Sep 25 2003, 09:18:33 AM MDT 4 Comments

Tiles Tips o' the Day

Here's a couple of things I learned today that might be useful to you Struts developers out there. When using Tiles, you'll normally import all the attributes into your baseLayout.jsp, and then your attributes are exposes as beans/scripting variables (you can actually grab them with JSTL tags). Rather than using:

<tiles:importAttribute/>

Use:

<tiles:importAttribute scope="request"/>

And then all your inserted pages can access these attributes. Pretty slick when you got a little JSTL love in the mix. The second tip is how to implement definition path switching. Let's look at the following baseLayout definition as an example:

  <definition name=".baseLayout" path="/layouts/baseLayout.jsp">
    <put name="titleKey"/>
    <put name="header" value="/common/header.jsp"/>
    <put name="sidebar" value=".sidebar"/>
    <put name="footer" value="/common/footer.jsp"/>
  </definition>

You currently cannot change the "path" attribute with a Controller, so you have to do it as the Tiles author recommends - by changing your path to refer to an action. So I changed the path on this particular definition to be:

<definition name=".baseLayout" path="/do/switchLayout">

Where my action-mapping is defined as follows:

 <action path="/switchLayout" 
   type="org.appfuse.webapp.action.SwitchLayoutAction">
   <forward name="printLayout" path="/layouts/printLayout.jsp" />
   <forward name="baseLayout" path="/layouts/baseLayout.jsp" />
 </action>

Then in SwitchLayoutAction.java, I have the following code:

boolean print =
    Boolean.valueOf(request.getParameter("print")).booleanValue();

// see if a print parameter is passed in the request
if (print) {
    log.debug("switching base layout to printing...");

    return mapping.findForward("printLayout");
} else {
    return mapping.findForward("baseLayout");
}

Pretty slick IMO! It's easy to make the printLayout.jsp only contain some simple wrapper stuff and only do <tile:insert attribute="content"/>. Of course, in this particular example, you could just use a print stylesheet (media="print"), but that doesn't work so well on 4.x browsers (man I hate those beotches).

Posted in Java at Sep 24 2003, 03:01:03 PM MDT 4 Comments

This site isn't doing so well...

Since I upgraded to Roller 0.9.8, this site has crashed twice. Once last night, and once this afternoon. Both appear to be caused by a MySQL failure, followed by an AJP to Tomcat failure. I haven't asked Keith yet, but I do suspect it's a hosting issue, not a software issue.

Update: From Keith:

No problems with the database as far as I can tell from the logs.

Uptime on the server is currently 9939830 seconds or 115 days.  Is it 
possible that you are hitting the 20 connection per user max?

Well at least it stayed up through the night, if it goes again then obviously it's Roller 0.9.8 and I'll be reverting back to the last version (a CVS snapshot) I had running.

Posted in Roller at Sep 22 2003, 09:45:22 PM MDT 9 Comments

Vanity URLs in Struts

I figured out a way to make your Struts' app have URLs like the following:

http://raibledesigns.com/weblog?method=edit
http://raibledesigns.com/weblog.jsp?method=edit
http://raibledesigns.com/weblog.html?method=edit
http://raibledesigns.com/weblog.php?method=edit
http://raibledesigns.com/weblog.asp?method=edit

Might be a nifty little trick to try. Pump out a version of Roller with this feature enabled and you could say you made a .NET version! ;-)

Here's how:

1.  I created a RequestFilter that maps to /*
2.  This filter checks to see if request.getServletPath() matches any of the
action paths in struts-config.xml.  If so, it forwards to the action.
3.  As an added feature, I added a set of allowed extensions to this
filter's init parameters.  So far I have .jsp,.html,.asp,.cfm (using .jsp
ensures no one links to them directly, MVC enforced!) - so marketing can
choose what technology they want to convey ;-)

This seems to work great.  For example, I have an "advancedSearch" action
defined as follows:

    <action path="/advancedSearch"
      type="org.apache.struts.actions.ForwardAction" 
      parameter=".advancedSearch"/>

(ForwardAction will eventually be replaced, if necessary, with a real
action).  This allows all of the following URLs to work:

http://site.com/do/advancedSearch (works with Struts by default)
http://site.com/advancedSearch
http://site.com/advancedSearch.html + all other extensions listed.

More information (including source code) can be found on the struts-user mailing list.

Posted in Java at Sep 19 2003, 06:23:24 PM MDT 2 Comments