顯示數據到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