一、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:输出日志事件发生位置,也即是输出日志信息的语句所处于它在所在类的第几行。

十三、MVC的WEB框架(Structs2)的更多相关文章

  1. 十五、MVC的WEB框架(Structs2)

    一.Structs标签 与JSTL标签库类似,Structs2也有专属标签库 常见的标签有:from,iterator,check,radio,select 1.form标签 用于提交数据 <% ...

  2. 十四、MVC的WEB框架(Structs2)

    一.Structs2中的Session 1.一个是传统的servlet包下的HttpSession,一个是Structs2中自己定义的Session Servlet下的Session获取方法:Serv ...

  3. 二十、MVC的WEB框架(Spring MVC)

    一.Spring MVC 运行原理:客户端请求提交到DispatcherServlet,由DispatcherServlet控制器查询HandlerMapping,找到并分发到指定的Controlle ...

  4. 二十一、MVC的WEB框架(Spring MVC)

    一.基于注解方式配置 1.首先是修改IndexContoller控制器类 1.1.在类前面加上@Controller:表示这个类是一个控制器 1.2.在方法handleRequest前面加上@Requ ...

  5. 五大 JAVA Web 框架的优缺点对比,Spring MVC 领先

    毫无疑问,Java 是当今世界上最重要的编程语言之一.js 框架给程序员提供了 一个可以构建程序的坚实基础.它包括定义的类和功能,用于硬件设备管理,与系统软件交互并处理输入,让开发人员变得更轻松.Ja ...

  6. Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案(转)

      前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件 ...

  7. Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

  8. Spring 4 官方文档学习(十三)集成其他web框架

    重点是通用配置,非常建议看一下!有助于理解Spring的ApplicationContext与Servlet Container的关系! 1.介绍 Spring Web Flow SWF目标是成为we ...

  9. 转-Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

随机推荐

  1. 51nod 1422 沙拉酱前缀

    http://www.51nod.com/onlineJudge/questionCode.html#problemId=1422&noticeId=399940 题意: 思路: 先把所有步骤 ...

  2. 点击返回上一页 wx.navigateTo不管用了

    做跳转的时候,发现想返回上一页,但是这个上一页又是tab上的页面,返回不了怎么办呢 wx.navigateTo({ url: '../search/search', })   解决方法: wx.reL ...

  3. 【Selenium2】【selenium之 定位以及切换frame(iframe)】

    参考:http://blog.csdn.net/huilan_same/article/details/52200586 总有人看不明白,以防万一,先在开头大写加粗说明一下: frameset不用切, ...

  4. Python 函数也是一种对象

    函数也是一种对象 func = lambda x, y: x+y print func(3, 4) def func(x, y): return x+y print func(3, 4) 效果相同. ...

  5. java 之2D过气游戏类的写法

    2D游戏中各对象的父类 package cn.littlepage.game; import java.awt.Graphics; import java.awt.Image; import java ...

  6. [转]VS中的路径宏 OutDir、ProjectDir、SolutionDir各种路径含义

    转自 http://blog.csdn.net/restraint/article/details/39934401 说明 $(RemoteMachine) 设置为“调试”属性页上“远程计算机”属性的 ...

  7. tips 移入悬浮功能

    前景: 页面部分区域需要移入悬浮效果,当然默认的 title 也是可以的,最多只是格格不入,但是却是最为靠谱的.. 思路: 基于 jq 实例扩展 .使用立即执行函数保持功能独立. 自定义类实现功能封装 ...

  8. 书法字帖 PDF转化为可打印PDF

    书法类的PDF,因为底色是黑色的,打印起来特别费墨,所以需要转化成白底黑字的文件, 才好打印. 1)用 pdfbox 的 ExtractImages 命令,抽出所有的图片 https://pdfbox ...

  9. 百度Apollo搭建步骤(待更新)

    百度Apollo搭建步骤 ##一.安装ubuntu16.04 无需多说,安装完成打开命令行. ##二.下载Apollo镜像 git clone https://github.com/ApolloAut ...

  10. English trip V1 - 20.Look at me 看着我 Teacher:Solo Key: 声调(英语默认就声调[rising]和降调[falling]两种)

    In this lesson you will learn to describe a person. 课上内容(Lesson) appearance  -> ap pea ran ce  外貌 ...