菜鸟问log4j怎么用,struts2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了菜鸟问log4j怎么用,struts2相关的知识,希望对你有一定的参考价值。

加了log4j的jar包,在classes目录下配置了log4j.properties,内容如下
web.xml里还用配置吗?我还得配置哪里
怎么才能记录日志?出现异常的时候也没见有日志文件产生

### set log levels ###
log4j.rootLogger = INFO , stdout , D

### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = WARN
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d - %c -%-4r [%t] %-5p %c %x - %m%n

### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = INFO
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-dyyyy-MM-dd HH:mm:ss [ %t:%r ] - [ %p ] %m%n

### 保存异常信息到单独文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-dyyyy-MM-dd HH:mm:ss [ %t:%r ] - [ %p ] %m%n

  1、 Log4j是什么
  Log4j可以帮助调试(有时候debug是发挥不了作用的)和分析,要下载和了解更详细的内容。

  2、Log4j的概念
  Log4j中有三个主要的组件,它们分别是 Logger、Appender和Layout,Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远 存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。
  Appender则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是既可以将Log信息输出到屏幕,同时存储到一个文件中。
  Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。
  Log4j中将要输出的Log信息定义了5种级别,依次为DEBUG、INFO、WARN、ERROR和FATAL,当输出时,只有级别高过配置中规定的 级别的信息才能真正的输出,这样就很方便的来配置不同情况下要输出的内容,而不需要更改代码,这点实在是方便啊。

  3、Log4j的配置文件
  虽然可以不用配置文件,而在程序中实现配置,但这种方法在如今的系统开发中显然是不可取的,能采用配置文件的地方一定一定要用配置文件。
参考技术A 配置已经可以了,在程序中
Logger logger = Logger.getLogger(MyApp.class);
在catch中
logger.error(e);本回答被提问者采纳

菜鸟学Struts2——Actions

  在对Struts2的工作原理学习之后,对Struts2的Action进行学习。主要对Struts2文档Guides中的Action分支进行学习,如下图:

技术分享

1、Model Driven(模型驱动)

Struts2可以让开发者不必在需要接收很多参数的时候,在Action定义一系列的属性,或者定义一个类属性传参的时候使用className.fieldName的形式传值。使用Struts2的Model Driven需要打开Model Driven拦截器,不过这个拦截器(scopedModelDriven)默认是打开的,只要将自己的包继承“struts-default”包即可(<package name="..." extends="struts-default" namespace="...">)。

(1)利用模型驱动进行开发,Action需要实现ModelDriven接口,并重写getModel()提供泛型中的Model对象。 

 1 package yaolin.core.action;
 2 
 3 import com.opensymphony.xwork2.ModelDriven;
 4 import yaolin.core.entity.Person;
 5 
 6 public class PersonAction implements ModelDriven<Person>{
 7     
 8     private Person person = new Person();
 9     
10     public String input() {
11         return "input";
12     }
13     
14     public String index() {
15         return "index";
16     }
17     // 重写ModelDriven的getModel()方法并提供Model对象
18     @Override
19     public Person getModel() {
20         return person;
21     }
22     // UI getter 这里只是方便页面取值
23     public Person getPerson() {
24         return person;
25     }
26 }

 (2)Model有两个属性(name、age),提供必要getter和setter。 

 1 package yaolin.core.entity;
 2 
 3 public class Person {
 4 
 5     private String name;
 6     private int age;
 7 
 8     public String getName() {
 9         return name;
10     }
11 
12     public void setName(String name) {
13         this.name = name;
14     }
15 
16     public int getAge() {
17         return age;
18     }
19 
20     public void setAge(int age) {
21         this.age = age;
22     }
23 }

 (3)创建编辑页面(input.jsp)和回显页面(index.jsp),访问input.action到input.jsp填写信息提交到person.action(index方法处理)到index.jsp回显。

input.jsp不需要参数名不需要使用person.name、person.age,直接使用name和age。 

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html>
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>INPUT</title>
 8 </head>
 9 <body>
10 <!-- /person/... -->
11 <form action="person.action" method="post">
12     <input name="name">
13     <input name="age">
14     <input type="submit" value="to_index">
15 </form>
16 </body>
17 </html>

 index.jsp直接获取person的值。 

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html>
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>INPUT</title>
 8 </head>
 9 <body>
10 ${person.name} - ${person.age}
11 </body>
12 </html>

 (4)修改struts.xml对访问路径进行路由  

 1 <!DOCTYPE struts PUBLIC
 2     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 3     "http://struts.apache.org/dtds/struts-2.3.dtd">
 4 <struts>
 5     <package name="person" extends="struts-default" namespace="/person">
 6         <action name="person" class="yaolin.core.action.PersonAction" method="index">
 7             <result name="index">/index.jsp</result>
 8         </action>
 9         <action name="input" class="yaolin.core.action.PersonAction" method="input">
10             <result name="input">/input.jsp</result>
11         </action>
12     </package>
13 </struts>

  (5)访问input.action填写信息并提交观察结果

技术分享

技术分享

如果没有Model Driven则需要在Action,定义两个属性name、age而不是person并提供getter和setter,或者定义person并提供getter和setter同时将页面参数名称改成person.name、person.age

2、Action Chaining (Aciton链)

Action链可以将一个请求经过多个Action处理,并保持Request中的参数,这个Redirect重定向有点区别,Action链可以将请求叫同一个namespace的action处理,也可以交给其他namespace的action处理,实现Action Chain需要将result的type设置成“chain”。

(1)修改Struts.xml添加chain.action,还是使用ModelDriven学习中的input方法来处理这个请求,将result的type设置成“chain”把请求交给namespace="/chain"的chain.action处理。

 1 <!DOCTYPE struts PUBLIC
 2     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 3     "http://struts.apache.org/dtds/struts-2.3.dtd">
 4 <struts>
 5     <package name="person" extends="struts-default" namespace="/person">
 6         <action name="person" class="yaolin.core.action.PersonAction" method="index">
 7             <result name="index">/index.jsp</result>
 8         </action>
 9         <action name="input" class="yaolin.core.action.PersonAction" method="input">
10             <result name="input">/input.jsp</result>
11         </action>
12         <action name="chain" class="yaolin.core.action.PersonAction" method="input">
13             <result type="chain" name="input">
14                 <param name="actionName">chain</param>
15                 <param name="namespace">/chain</param>
16             </result>
17         </action>
18     </package>
19     
20     <package name="chain" extends="struts-default" namespace="/chain">
21         <action name="chain" class="yaolin.core.action.ChainAction" method="index">
22             <result name="index">/index.jsp</result>
23         </action>
24     </package>
25 </struts>

 (2)创建ChainAction对请求进行再次处理,并对额外参数进行处理,结果还是回显在index.jsp页面中。ChainAction中将person的名字加上前缀“Chain:”同时将额外参数extras加到名字后面。

 1 package yaolin.core.action;
 2 
 3 import com.opensymphony.xwork2.ModelDriven;
 4 
 5 import yaolin.core.entity.Person;
 6 
 7 public class ChainAction implements ModelDriven<Person>{
 8     
 9     private Person person = new Person();
10     private String extra;
11     
12     public String index() {
13                 // 修改person的name属性
14         person.setName("Chain : " + person.getName() + " " + extra);
15         return "index";
16     }
17 
18     @Override
19     public Person getModel() {
20         return person;
21     }
22     
23     // UI
24     public Person getPerson() {
25         return person;
26     }
27     // POI
28     public void setExtra(String extra) {
29         this.extra = extra;
30     }
31 }
32     

 (3)访问input.action并带上name,age和额外参数extras:http://localhost/person/chain.action?name=yaolin&age=18&extra=chen观察结果

技术分享

 

3、ActionEventListener (Action事件监听器)

 Action事件监听器可以使开发者在Action创建的时候加入一些业务逻辑,或者在Action处理出错的时候进行处理。整个Struts应用ActionEventListener只要一个实例就可以了,设置成单例,使用ActionEventListener可以在struts.xml中配置bean,ActionEventListener需要实现ActionEventListener接口。

(1)编写自己的ActionEventListener,并重写prepare()和handleException()方法,在prepare()方法中为Action的extra设置值

 1 package yaolin.core.listener;
 2 
 3 import com.opensymphony.xwork2.ActionEventListener;
 4 import com.opensymphony.xwork2.util.ValueStack;
 5 
 6 import yaolin.core.action.ChainAction;
 7 
 8 public class MyActionEventListener implements ActionEventListener{
 9 
10     @Override
11     public Object prepare(Object action, ValueStack stack) {
12         if (action instanceof ChainAction) {
13             // 设置Action的extra值
14             ((ChainAction)action).setExtra("##ChainActionEventListener##");
15         }
16         return action;
17     }
18 
19     @Override
20     public String handleException(Throwable t, ValueStack stack) {
21         if (t != null) {
22             System.err.println(t.getMessage());
23         }
24         return null;
25     }
26 }

 (2)在Struts.xml中配置ActionEventListener,指定其类型为其实现的主要接口com.opensymphony.xwork2.ActionEventListener。其他配置沿用之前两个部分学习的配置。

 1 <!DOCTYPE struts PUBLIC
 2     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 3     "http://struts.apache.org/dtds/struts-2.3.dtd">
 4 <struts>
 5     <package name="person" extends="struts-default" namespace="/person">
 6         <action name="person" class="yaolin.core.action.PersonAction" method="index">
 7             <result name="index">/index.jsp</result>
 8         </action>
 9         <action name="input" class="yaolin.core.action.PersonAction" method="input">
10             <result name="input">/input.jsp</result>
11         </action>
12         <action name="chain" class="yaolin.core.action.PersonAction" method="input">
13             <result type="chain" name="input">
14                 <param name="actionName">chain</param>
15                 <param name="namespace">/chain</param>
16             </result>
17         </action>
18     </package>
19 
20     <package name="chain" extends="struts-default" namespace="/chain">
21         <action name="chain" class="yaolin.core.action.ChainAction" method="index">
22             <result name="index">/index.jsp</result>
23         </action>
24     </package>
25     
26     <!-- 配置ActionEventListener -->
27     <bean type="com.opensymphony.xwork2.ActionEventListener" class="yaolin.core.listener.MyActionEventListener"></bean>
28 </struts>

(3)直接访问/chain/chain.aciton不带参数,参数由ActionEventListener设置,观察结果

技术分享

 

 

至此,Struts2中Guides的Action Tag学习了。

未完,待续。 

以上是关于菜鸟问log4j怎么用,struts2的主要内容,如果未能解决你的问题,请参考以下文章

菜鸟问下关于TextArea和Label方面的简单问题

求助,spark里的Log4j怎么用

(菜鸟)了解一下MFC程序如何进入WinMain的

ELK菜鸟手记 - 利用filebeat和不同端口把不同服务器上的log4j日志传输到同一台ELK服务器

log4j在java的web项目中怎么用的,如何配置等等。。

菜鸟应该怎么学习嵌入式