显示数据到jsp
把Model的数据显示在视图JSP上
1、Product.java用于存放数据
Model层使用一个简单的Product用于存放数据
package com.hjsy.bean;
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用于控制package com.hjsy.action;
import com.hjsy.bean.Product;
public class ProductAction {
private Product product;
public String show() {
product = new Product();
product.setName("hjsy");
return "show";
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
}
3、在struts.xml配置跳转
该配置表示访问路径/showProduct会调用
ProductAction 类的 show 方法
服务端跳转到show.jsp
<?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="index">
<result>index.jsp</result>
</action>
<action name="showProduct" class="com.hjsy.action.ProductAction" method="show">
<result name="show">show.jsp</result>
</action>
</package>
</struts>
4、show.jsp
在web目录下创建show.jsp文件
通过EL表达式,取出product的name
注: ${product}会访问对应的Action的 getProduct()方法
注: 严格得说,是Struts通过getProudct()方法返回product对象,然后再把product对象通过request.setAttribute("product",
product) 放在"product" 这个key上,这样就方便EL表达式去取出来了
<%@page isELIgnored="false"%>
${product.name}
5、测试
重启tomcat
访问 http://127.0.0.1:8080/struts/showProduct
6、原理图
(1)
访问路径 /showProduct
(2) 所有访问都被struts的filter所拦截,并进入struts的工作流程
(3) 根据配置文件struts.xml, 会执行ProductAction的show方法
(4) 在show方法中,将实例属性product指向一个新的对象,并设置名称为hjsy
(5)服务端跳转到show.jsp
(6)在show.jsp中,访问ProductAction.getProduct() 获取实例属性product,并显示其名称hjsy
7、提交数据到action
jsp提交product的name到action
然后action又跳转回showProduct.jsp把提交上来的name显示出来
addProduct.jsp
最简单的提交数据的form(此时提交会有中文问题,后面会介绍)
<html>
<form action="addProduct">
<input type="text" name="product.name">
<br/>
<input type="submit" value="submit">
</form>
</html>
8、配置struts.xml
为addProduct路径配置对应的action和方法以及返回
<?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="index">
<result>index.jsp</result>
</action>
<action name="showProduct" class="com.hjsy.action.ProductAction"
method="show">
<result name="show">show.jsp</result>
</action>
<action name="addProduct" class="com.hjsy.action.ProductAction"
method="add">
<result name="show">show.jsp</result>
</action>
</package>
</struts>
9、ProductAction增加add方法在addProduct.jsp中提交数据的field是product.name
会自动调用对应的Action的setProduct(Product product)方法进行数据的注入
所以ProductAction必须提供setProduct(Product product)方法
在执行到红色位置的时候,jsp传过来的name已经被注入进了属性product中了
package com.hjsy.action;
import com.hjsy.bean.Product;
public class ProductAction {
private Product product;
public String show() {
product = new Product();
product.setName("hjsy");
return "show";
}
public String add(){
System.out.println("product.name:"+product.getName());
return "show";
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
}
10、测试
重启tomcat,访问 http://127.0.0.1:8080/struts/addProduct.jsp 并提交数据
11、原理图
(1)访问路径 /addProduct
(2)所有访问都被struts的filter所拦截,并进入struts的工作流程
(3)根据配置文件struts.xml, 会执行ProductAction的add方法
(4)在add方法执行之前,Struts生成一个新的product对象,并把页面传递过来的name设置在该对象上,接着把该对象通过setProduct()方法,注入ProductAction
(5)服务端跳转到show.jsp
(6)在show.jsp中,访问ProductAction.getProduct() 获取注入的product,并显示其名称
12、中文问题
Struts的中文问题,由3部分组成
(1) jsp提交数据的时候,必须是UTF-8编码的
(2)struts拿到数据后进行UTF-8解码
(3) 服务端跳转到jsp进行显示的时候,要指定浏览器使用UTF-8进行显示
UTF-8可以换成GBK或者GB2312,但是必须统一,不能混用
提交数据的 addProduct.jsp
提交数据的时候指定编码方式UTF-8
并且设置form 的method为post方式
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<form action="addProduct" method="post">
<input type="text" name="product.name">
<br/>
<input type="submit" value="submit">
</form>
</html>
13、struts.xml
指定解码方式为UTF-8
<?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>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="basicstruts" extends="struts-default">
<action name="index">
<result>index.jsp</result>
</action>
<action name="showProduct" class="com.hjsy.action.ProductAction"
method="show">
<result name="show">show.jsp</result>
</action>
<action name="addProduct" class="com.hjsy.action.ProductAction"
method="add">
<result name="show">show.jsp</result>
</action>
</package>
</struts>
14、显示数据的show.jsp
服务端跳转到jsp进行显示的时候,要指定浏览器使用UTF-8进行显示
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@page isELIgnored="false"%>
${product.name}
15、测试
重启tomcat,访问
http://127.0.0.1:8080/struts/addProduct.jsp
16、启动失败,出现错误ERROR FILTERSTART 应该如何调试
在tomcat启动struts web应用的时候,如果出现了struts配置上的错误,你可能只能看到一个 Error FilterStart的提示,而看不到详细的错误原因。
这样就加大了定位和解决问题的难度
这是因为默认配置下,struts把日志输出关闭了
为了把日志输出开启便于调试,需要增加log4j.xml这个配置文件
17、故意制造一个struts的配置错误
在一下红色处,故意制造一个错误,把ProductAction写成ProductAction1
这样struts就会启动失败,虽然启动失败了,但是tomcat给出的错误信息非常有限,很不利于调试。 无法知道到底哪里写错了。
<?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>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="basicstruts" extends="struts-default">
<action name="index">
<result>index.jsp</result>
</action>
<action name="showProduct" class="com.hjsy.action.ProductAction1"
method="show">
<result name="show">show.jsp</result>
</action>
<action name="addProduct" class="com.hjsy.action.ProductAction"
method="add">
<result name="show">show.jsp</result>
</action>
</package>
</struts>
18、在src目录下增加log4j.xml在src目录下增加log4j.xml,打开日志功能
然后重新启动tomcat即可看到具体struts启动失败错误原因
<?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="DEBUG" />
</logger>
<logger name="org.apache.struts2">
<level value="DEBUG" />
</logger>
<!-- for all other loggers log only debug and above log messages -->
<root>
<priority value="INFO"/>
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
19、关闭log4j.xml日志输出
有了log4j.xml日志输出可以帮助调试,但是也会导致struts的启动变慢。
关闭log4j.xml日志输出很简单,直接把log4j.xml命名成其他文件即可,以后要用再把名字改回来,很方便
源码:链接:https://pan.baidu.com/s/1o9K2o9W 密码:4rve