十三、MVC的WEB框架(Structs2)
一、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)的更多相关文章
- 十五、MVC的WEB框架(Structs2)
一.Structs标签 与JSTL标签库类似,Structs2也有专属标签库 常见的标签有:from,iterator,check,radio,select 1.form标签 用于提交数据 <% ...
- 十四、MVC的WEB框架(Structs2)
一.Structs2中的Session 1.一个是传统的servlet包下的HttpSession,一个是Structs2中自己定义的Session Servlet下的Session获取方法:Serv ...
- 二十、MVC的WEB框架(Spring MVC)
一.Spring MVC 运行原理:客户端请求提交到DispatcherServlet,由DispatcherServlet控制器查询HandlerMapping,找到并分发到指定的Controlle ...
- 二十一、MVC的WEB框架(Spring MVC)
一.基于注解方式配置 1.首先是修改IndexContoller控制器类 1.1.在类前面加上@Controller:表示这个类是一个控制器 1.2.在方法handleRequest前面加上@Requ ...
- 五大 JAVA Web 框架的优缺点对比,Spring MVC 领先
毫无疑问,Java 是当今世界上最重要的编程语言之一.js 框架给程序员提供了 一个可以构建程序的坚实基础.它包括定义的类和功能,用于硬件设备管理,与系统软件交互并处理输入,让开发人员变得更轻松.Ja ...
- Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案(转)
前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件 ...
- Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...
- Spring 4 官方文档学习(十三)集成其他web框架
重点是通用配置,非常建议看一下!有助于理解Spring的ApplicationContext与Servlet Container的关系! 1.介绍 Spring Web Flow SWF目标是成为we ...
- 转-Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...
随机推荐
- OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000083e80000, 1366294528, 0) failed;
我是在手动搭建nexus时遇到的 安装nexus时 启动命令的时候会报OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000 ...
- Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1
Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1 int 值的取值 范围: -128 --- 127 之间, 0000 0000 按位取 ...
- Spring分布式事务实现概览
分布式事务,一直是实现分布式系统过程中最大的挑战.在只有单个数据源的单服务系统当中,只要这个数据源支持事务,例如大部分关系型数据库,和一些MQ服务,如activeMQ等,我们就可以很容易的实现事务. ...
- leecode第二十六题(删除排序数组中的重复项)
class Solution { public: int removeDuplicates(vector<int>& nums) { int len=nums.size(); ) ...
- 人脸识别最新开发经验demo分享
本来打算做个C#版demo,但没用成功,基于虹软的免费人脸识别技术 过程如下: 1. 传入一张单人脸照片: 2.调用检测人脸函数ASFDetectFaces,成功返回人脸信息的指针: 3.使用 Mar ...
- eclipse 配置打开工作空间
转载自: https://www.cnblogs.com/qq1871707128/p/6093860.html 首先得有eclipse 一.在eclipse的菜单栏中点击 Run -->Ext ...
- R语言做一元线性回归
只有两个变量,做相关性分析,先来个一元线性回归吧 因为未处理的x,y相关性不显著,于是用了ln(1+x)函数做了个处理(发现大家喜欢用ln,log,lg,指数函数做处理),处理完以后貌似就显著了..虽 ...
- 7内存管理-MRC
@0简介 内存管理,即内存里各个对象的管理,即内存里各个对象的生命周期的管理,(从面向对象的角度看) @1引用计数器 默认为1,即有一滴的生命血液,若为0就会死去 @2单个对象的管理 自己管理自己,自 ...
- Bash Shell 注释多行的几种方法(转)
很实用的小技巧. 我们shell脚本写好了,但是想一行一行测试,怎么办. 笨方法:每行前面加一个 #,有时候我们原脚本里面本来就有注释,所以想再恢复的时候就麻烦了. Bash Shell 注释多行的几 ...
- FreeBSD之基本配置
1. 设置IP地址.网关ee /etc/rc.conf ifconfig_em0="inet 192.168.21.173 netmask 255.255.255.0" #设置 ...