一、Structs2的应用
Structs2是基于MVC的WEB框架。一般基于框架的程序要运行成功,对于JAR包的版本,配置文件的正确性有着苛刻的要求,一个地方错了,都会导致框架程序运行出错。
1、首先在Eclipse创建一个动态web项目structs,使用dynamic web project的方式。
2、新建web.xml
在WEB-INF目录下新建web.xml,然后配置一个过滤器Filter,所有的请求都让这个过滤器进行过滤
<web-app> <filter> <filter-name>structs2</filter-name> <filter-class>org.apache.structs2.ng.filter.StructsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>structs2</filter-name> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3、配置structs.xml
在src目录下创建一个structs.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="basicstruts" extends="struts-default"> <!--当访问index路径的时候,服务端跳转到index.jsp--> <action name="index"> <result>index.jsp</result> </action> </package> </struts>
4、创建index.jsp
在webContent目录下创建index.jsp,输入HelloWorld
5、Structs2的运行原理
5.1、所有的访问都会被web.xml中配置的structs的Filter进行过滤工作
5.2、 进行过滤工作,进入structs的工作流程
5.3、访问的地址是/index,根据structs按照structs.xml中配置,服务端跳转到index.jsp
5.4、显示index.jsp的内容
二、显示数据到JSP
把Model的数据显示在视图JSP上
1、建立一个实体类Product.java
Model层使用一个Product用于存放数据
package com.demo.model; public class Product { int id; String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2、建立一个控制器ProductAction.java
Action层使用
package com.demo.action; import com.demo.model.Product; public class ProductAction{ private Product product; public String show(){ product=new Product(); product.setName("apple"); return "show"; } public Product getProduct(){ return product; } public void setProduct(Product product){ this.product=product; } }
3、在structs.xml中配置跳转
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="basicstruts" extends="struts-default"> <!--当访问路径为/showProduct时,会调用ProductAction的方法show,服务端跳转到show.jsp--> <action name="showProduct" class="com.demo.action.ProductAction" method="show"> <result name="show">show.jsp</result> </action> </package> </struts>
4、show.jsp的创建
在webContent目录下创建show.jsp文件,通过EL表达式,取出product的name
${product}会访问对应的Action的getProduct()方法
5、过程原理
5.1、当访问路径是/showProduct时
5.2、所有访问都被structs的Filter拦截,进入到structs的工作流程
5.3、根据配置文件structs.xml,会执行ProductAction的show方法
5.4、在show方法中,将实例属性product指向一个新的对象,然后设置名称
5.5、服务端跳转show.jsp
5.6、在show.jsp中,访问ProductAction.getProduct()获取实例属性product,并显示名称。
三、提交数据到Action
比如jsp提交product的name到action,然后action有跳转回来showProduct.jsp把提交的name显示出来。
1、form表单提交数据
<from action="addProduct"> <input type="text" name="product.name"/> <br/> <input type="submit" value="submit"/> </form>
2、ProductAction增加addProduct()方在addProduct.jsp中提交数据的field是product.name,会自动调用对应的Action的setProduct(Product product)方法进行数据的注入
所以ProductAction必须提供setProduct(Product product)方法。
package com.demo.action; import com.demo.model.Product; public class ProductAction { private Product product; public String show(){ product = new Product(); product.setName("iphone7"); return "show"; } public String addProduct(){ System.out.println("product.name:"+product.getName()); return "show"; } public Product getProduct() { return product; } public void setProduct(Product product) { this.product = product; } }
3、配置stucts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="basicstruts" extends="struts-default"> <action name="showProduct" class="com.demo.action.ProductAction" method="show"> <result name="show">show.jsp</result> </action> <action name="addProduct" class="com.demo.action.ProductAction" method="add"> <result name="show">show.jsp</result> </action> </package> </struts>
4、中文问题
structs的中文问题,3部分构成:
4.1、jsp提交数据的时候,必须是UTF-8编码
4.2、structs拿到数据后进行UTF-8编码
4.3、服务端跳转到jsp进行显示的时候,也要指定浏览器使用UTF-8显示。
UTF-8可以换成GBK,GB2312,但是必须要统一的编码,不能混用。
四、使用日志
在src目录下增加log4j.xml,打开日志功能。
有时候由于失误,导致action名字配置错误等,strcuts启动失败,而且tomcat给出的错误信息很不利于调试,无法知道哪里写错,可以使用log4j功能
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n"/> </layout> </appender> <!-- specify the logging level for loggers from other libraries --> <logger name="com.opensymphony"> <level value="ERROR" /> </logger> <logger name="org.apache"> <level value="ERROR" /> </logger> <logger name="org.hibernate"> <level value="ERROR" /> </logger> <!-- for all other loggers log only debug and above log messages --> <root> <priority value="ERROR"/> <appender-ref ref="STDOUT" /> </root> </log4j:configuration>
也可以使用log4j.properties文件(key-value形式的文件)的方式。
#设置日志输出的登记为debug,低于debug就不会输出了 #设置日志输出到两种地方,分别叫做stdout和R log4j.rootLogger=debug, stdout, R #日志输出第一个地方stdout,输出到控制台 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout #输出格式是%5p [%t] (%F:%L) - %m%n log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n #日志输出第二个地方R,以滚动的方式输出到文件,文件名是example.log,文件最大为100k,最多滚动5个文件 log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log log4j.appender.R.MaxFileSize=100KB log4j.appender.R.MaxBackupIndex=5 #输出格式是%p %t %c -%m%n log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n #log4j日志输出格式解释: #%p:表示输出优先级,以debug,info,warn,error,fatal。如果调用debug输出,则为debug #%t:输出产生该日志时间的线程名 #%c:输出日志信息所属的类的全名 #%m:输出代码中指定的信息,如log(message)中的message #%n:输出一个回车换行符号 #%d:输出日志时间点的日期或时间。也可以指定时间格式%d{yyy-MM-dd HH:mm:ss} #%F:输出日志信息所属的类的类名 #%L:输出日志事件发生位置,也即是输出日志信息的语句所处于它在所在类的第几行。