1.7)新建AdminAction类
新建文件Bitrac\src\com\albertsong\bitrac\action\AdminAction.java,(以后所有XXAction都放在相同的目录下,不再重复说明)内容如下:
- package com . albertsong . bitrac . action ;
- import com . albertsong . bitrac . dao . Member ;
- import org . apache . commons . logging . Log ;
- import org . apache . commons . logging . LogFactory ;
- public class AdminAction {
- private Log log = LogFactory . getLog ( AdminAction . class ) ;
- private Member member ;
- public Member getMember () {
- return member ;
- }
- public void setMember ( Member member ) {
- this . member = member ;
- }
- public String login (){
- log . debug ( " member.username= " + member . getUsername ()) ;
- log . debug ( " member.password= " + member . getPassword ()) ;
- return " success " ;
- }
- }
要让log起作用需要将
D:\JavaTools\spring-framework-2.5.5\lib\log4j\log4j-1.2.15.jar
D:\JavaTools\spring-framework-2.5.5\lib\jakarta-commons\commons-logging.jar
复制到/WEB-INF/lib下
将 commons-logging.jar改名为commons-logging-1.1.1.jar,并将commons-logging-api- 1.1.jar删掉。(我们只需要同一个组件的最新版本,多余的将被删除,以后不再重复说明,如果大家发现加入到/WEB-INF/lib里的后来又没 了,那就是删除了)。
然后在Eclipse里点选Bitrac,按F5刷新,这时工程的文件列表已经更新。Alt+Enter打开工程属性对话 框。Java Build PathLibrariesAdd JARs…将commons-logging-1.1.1.jar添加到编译路径,log4j-1.2.15.jar不需要添加,这个是在运行时起作用, 编译时不需要。添加好以后,编译的错误提示应该都消失了。
做好这些以后还需要对Log4j做一些配置。
在/WEB-INF/web.xml文件中添加
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>bitrac.root</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>
<listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
bitrac.root定义了一个代表Web应用程序根目录的变量,这个变量会在log4j.properties中使用。
加好以后完整的web.xml如下:
- <? xml version = " 1.0 " encoding = " UTF-8 " ?>
- < web-app id = " bitrac " version = " 2.4 " xmlns = " http://java.sun.com/xml/ns/j2ee " xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance " xsi:schemaLocation = " http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd " >
- < display-name > Bitrac Blog </ display-name >
- < context-param >
- < param-name > webAppRootKey </ param-name >
- < param-value > bitrac.root </ param-value >
- </ context-param >
- < context-param >
- < param-name > log4jConfigLocation </ param-name >
- < param-value > /WEB-INF/classes/log4j.properties </ param-value >
- </ context-param >
- < filter >
- < filter-name > Struts2 </ filter-name >
- < filter-class >
- org.apache.struts2.dispatcher.FilterDispatcher
- </ filter-class >
- </ filter >
- < filter-mapping >
- < filter-name > Struts2 </ filter-name >
- < url-pattern > /* </ url-pattern >
- </ filter-mapping >
- < listener >
- < listener-class > org.springframework.web.util.Log4jConfigListener </ listener-class >
- </ listener >
- <!--默认加载/WEB-INF 目录下的applicationContext.xml -->
- < listener >
- < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >
- </ listener >
- < welcome-file-list >
- < welcome-file > index.jsp </ welcome-file >
- </ welcome-file-list >
- </ web-app >
新建Bitrac\src\log4j.properties文件,内容如下:
log4j.rootLogger=INFO, stdout, logfile
log4j.logger.com.albertsong=DEBUG
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${bitrac.root}/WEB-INF/log/bitrac.log
log4j.appender.logfile.MaxFileSize=512KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
新建目录/WEB-INF/log
新建com.albertsong.bitrac.dao.Member.Java,内容如下:
- package com . albertsong . bitrac . dao ;
- import java . util . Date ;
- /**
- * @author Albert
- *
- */
- public class Member {
- private int id ;
- private short grade ;
- private String username ;
- private String password ;
- private String validate ;
- private boolean conserve ;
- private String contact ;
- private String picture ;
- private String explain ;
- private int numPost ;
- private int numComm ;
- private int numFile ;
- private Date publish ;
- private String address ;
- public int getId () {
- return id ;
- }
- public void setId ( int id ) {
- this . id = id ;
- }
- public short getGrade () {
- return grade ;
- }
- public void setGrade ( short grade ) {
- this . grade = grade ;
- }
- public String getUsername () {
- return username ;
- }
- public void setUsername ( String username ) {
- this . username = username ;
- }
- public String getPassword () {
- return password ;
- }
- public void setPassword ( String password ) {
- this . password = password ;
- }
- public String getValidate () {
- return validate ;
- }
- public void setValidate ( String validate ) {
- this . validate = validate ;
- }
- public boolean isConserve () {
- return conserve ;
- }
- public void setConserve ( boolean conserve ) {
- this . conserve = conserve ;
- }
- public String getContact () {
- return contact ;
- }
- public void setContact ( String contact ) {
- this . contact = contact ;
- }
- public String getPicture () {
- return picture ;
- }
- public void setPicture ( String picture ) {
- this . picture = picture ;
- }
- public String getExplain () {
- return explain ;
- }
- public void setExplain ( String explain ) {
- this . explain = explain ;
- }
- public int getNumPost () {
- return numPost ;
- }
- public void setNumPost ( int numPost ) {
- this . numPost = numPost ;
- }
- public int getNumComm () {
- return numComm ;
- }
- public void setNumComm ( int numComm ) {
- this . numComm = numComm ;
- }
- public int getNumFile () {
- return numFile ;
- }
- public void setNumFile ( int numFile ) {
- this . numFile = numFile ;
- }
- public Date getPublish () {
- return publish ;
- }
- public void setPublish ( Date publish ) {
- this . publish = publish ;
- }
- public String getAddress () {
- return address ;
- }
- public void setAddress ( String address ) {
- this . address = address ;
- }
- }
这里将Member.java放在dao下面,文件如何组织,包括类如何设计,完全是人为的,所谓的惯例和标准只是大家都公认的一些比较好的做法而已。我认为,目前将Member.java放在这里就可以了。
1.8)修改/index.jsp,内容如下:
- <%@ page contentType="text/html; charset=UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="refresh" content="0;url=admincp.jspx" />
- </head>
- <body>
- <p>Loading ...</p>
- </body>
- </html>
1.9)新建文件/admin/login.jsp,内容如下:
- <%@ page contentType="text/html; charset=UTF-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title> Bitrac Demo Site - 管理员控制面板</title>
- </head>
- <body>
- <div id="content">
- <div id="AdmEnter">
- <s:actionerror />
- <s:form action="login" namespace="/admin">
- <fieldset><legend>管理登录</legend>
- <s:textfield label="用户名" name="member.username" />
- <s:password label="密码" name="member.password" />
- <s:submit value="登录" />
- </fieldset>
- </s:form>
- </div>
- </div>
- <div id="footer">
- <p>Powered by <a href="http://www.albertsong.com" target="_blank">Bitrac(J) v0.1</a>. Designed by <a href="mailto:loveyuki@gmail.com">Loveyuki</a> &Programmed by <a href="mailto:albertsong.com@gmail.com">Albert Song</a></p>
- </div>
- </body>
- </html>
这里使用了struts的标签来将视图层(JSP)和控制层 (Action)关联在一起。注意到<s:form action="login" namespace="/admin">中的action和namespace就是我们在admin.xml中定义的。通过 name="member.username"这样的形式就可以将Action中的member成员和界面元素关联起来。
1.10)启动Tomcat,浏览http://localhost:8080/bitrac/
如 果上面的操作步骤都正确,那么会看到一个登录页面,点登录按钮会转到另一个页面。现在Struts2和Spring2已经集成在一起了。不过login里 面我们还什么都没写,这个程序还没有任何有用的功能。如果在用户名和密码框中填入内容,点登录以后在Eclipse的Console里会看到相应的调试信 息。
这里有很多警告,原因不清楚,不想看到它们并不难,在log4j.properties文件中log4j.logger.com.albertsong=DEBUG的下面加一行
log4j.logger.com.opensymphony.xwork2=ERROR
好了,现在清静了。