Struts学习
Posted 王育奕
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts学习相关的知识,希望对你有一定的参考价值。
使用Filter作为控制器的MVC
MVC设计模式概览
实现 MVC(Model、View、Controller) 模式的应用程序由 3 大部分构成:
模型:封装应用程序的数据和业务逻辑
视图:实现应用程序的信息显示功能
控制器:接收来自用户的输入,调用模型层,响应对应的视图组件
目录结构:
代码:
package com.yuyi.struts2.helloworld; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; /** * Servlet Filter implementation class FilterDispatcher */ @WebFilter("*.action") public class FilterDispatcher implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest) request; //1.获取ServletPath String ServletPath=req.getServletPath(); System.out.println(ServletPath); String path=null; //2.判断ServletPath,若其等于"/product-input.action",则转发到 ///WEB_INF/pages/input.jsp if("/product-input.action".equals(ServletPath)) { path="/WEB-INF/pages/input.jsp"; } //3.若其等于"/product-save.action",则 //1).获取请求参数 if("/product-save.action".equals(ServletPath)) { String productName=request.getParameter("productName"); String productDesc=request.getParameter("productDesc"); String productPrice=request.getParameter("productPrice"); //2).把请求参数封装为一个Product對象 Product product=new Product(null, productName, productDesc, Double.parseDouble(productPrice)); //3).执行保存操作 System.out.println("Save Product:"+product); product.setProductId(1001); //4).把Product对象保存到request中,${param.productName}->${requestScope.product.productName} request.setAttribute("product", product); path="/WEB-INF/pages/details.jsp"; } if(path!=null) { request.getRequestDispatcher(path).forward(request, response); return; } chain.doFilter(request, response); } public void init(FilterConfig fConfig) throws ServletException { } @Override public void destroy() { } }
Product.java
package com.yuyi.struts2.helloworld; public class Product { private Integer productId; private String productName; private String productDesc; private double productPrice; public Integer getProductId() { return productId; } public void setProductId(Integer productId) { this.productId = productId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public String getProductDesc() { return productDesc; } public void setProductDesc(String productDesc) { this.productDesc = productDesc; } public double getProductPrice() { return productPrice; } public void setProductPrice(double productPrice) { this.productPrice = productPrice; } public Product(Integer productId, String productName, String productDesc, double productPrice) { super(); this.productId = productId; this.productName = productName; this.productDesc = productDesc; this.productPrice = productPrice; } public Product() { } }
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <a href="product-input.action">Product Input</a> </body> </html>
input.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="product-save.action" method="post"> ProductName:<input type="text" name="productName"/> <br><br> ProductDesc:<input type="text" name="productDesc"/> <br><br> ProductPrice:<input type="text" name="productPrice"/> <br><br> <input type="submit" name="Submit"/> </form> </body> </html>
details.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> ProductId:${requestScope.product.productId} <br><br> ProductName:${requestScope.product.productName} <br><br> ProductDesc:${requestScope.product.productDesc} <br><br> ProductPrice:${requestScope.product.productPrice} <br><br> </body> </html>
以Filter作为控制器的Struts以上任务的步骤:
目录结构:
1.VS 自实现
1).搭建Struts2的开发环境
2).不需要显式的定义Filter,而是使用Struts2的配置文件。
3).details.jsp比之前变得简单。
${requestScope.product.productName}->${productName}
4).步骤:
1.由product-input.action转到/WEB-INF/pages/input.jsp
在struts配置一个action
<action name="product-input">
<result>/WEB-INF/pages/input.jsp</result>
</action>
2.由input.jsp页面的action:product.save到Product\'s save,再到/WEB-INF/pages/details.jsp
<action name="product-save" class="com.yuyi.struts2.helloworld.Product"
method="save">
<result name="details">/WEB-INF/pages/details.jsp</result>
</action>
在Product中定义一个save方法,且返回值为details
加入jar包,加入jar包的时候记得要到官网下载正确的jar包,我用的版本是struts2-3-35,把jar包复制到lib文件夹下
配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
配置struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- package:包,struts使用package来组织模块 name属性:必须,用于其他包应用当前包 extends:当前继承哪个包,继承的,即可以继承其中所有的配置,通常情况下继承struts-default struts-default这个包在struts-default.xml文件中定义 namespace 属性是可选的, 如果它没有给出, 则以 “/” 为默认值. 若 namespace 有一个非默认值, 则要想调用这个包里的Action, 就必须把这个属性所定义的命名空间添加到有关的 URI 字符串里 http://localhost:8080/contextPath/yuyi/actionName.action --> <package name="helloWorld" extends="struts-default" > <!-- 配置一个action:一个struts2的请求就是一个action name:对应一个struts2的请求的名字(或对一个servletPath,但去除/和扩展名),不包含扩展名 class的默认值为:com.opensymphony.xwork2.ActionSupport method的默认值为:execute result:结果 --> <action name="product-input" class="com.opensymphony.xwork2.ActionSupport" method="execute"> <!-- result:结果.action方法执行后可能返回的一个结果。所以一个action节点可能会有多个result子节点 多个result子节点使用name来区分 name:标识一个result和action方法的返回值对应。默认值为success type:表示结果的类型。默认值为dispatcher(转发到结果) --> <result name="success" type="dispatcher">/WEB-INF/pages/input.jsp</result> </action> <action name="product-save" class="com.yuyi.struts2.helloworld.Product" method="save"> <result name="details">/WEB-INF/pages/details.jsp</result> </action> </package> </struts>
Product.java
package com.yuyi.struts2.helloworld; public class Product { private Integer productId; private String productName; private String productDesc; private double productPrice; public Integer getProductId() { return productId; } public void setProductId(Integer productId) { this.productId = productId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public String getProductDesc() { return productDesc; } public void setProductDesc(String productDesc) { this.productDesc = productDesc; } public double getProductPrice() { return productPrice; } public void setProductPrice(double productPrice) { this.productPrice = productPrice; } @Override public String toString() { return "Product [productId=" + productId + ", productName=" + productName + ", productDesc=" + productDesc + ", productPrice=" + productPrice + "]"; } public String save() { System.out.println("save:"+this); return "details"; } }
index.jsp和input.jsp没有区别,details.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> ProductId:${productId} <br> <br> ProductName:${productName} <br> <br> ProductDesc:${productDesc} <br> <br> ProductPrice:${productPrice} <br> <br> </body> </html>
这样我们就可以理解Struts作为控制器的运行原理,它比原来我们自己敲代码更加简便和操作
以上是关于Struts学习的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,Prepar