SSH框架學習筆記--Struts2框架入門

參考資料:SSH框架整合實戰教程 傳智播客高教產品研發部

Struts2框架概念引入

做一個簡單的mvc小頁面,實現表單輸入數字實現加減法
目錄結構
在這裏插入圖片描述
Web頁面

add.jsp//視圖層
<body>
<form action="add.action" method="post">
<input type="text" name="num1"/><br/>
<input type="text" name="num2"/><br/>
<input type="submit" value="add" />
<input type="reset" value="clear"/>
</form>
</body>
add_result.jsp
<body>
results:${requestScope.add_result}
</body>

Cal.java //模型層

package model;

public class Cal {
	public double add(double a,double b) {
		return a+b;
	}
	public double sub(double a,double b) {
		return a-b;
	}
}

控制器 servlet

package controller;
public class CalServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String num1 = req.getParameter("num1");//得到表單數據
		String num2 = req.getParameter("num2");
		double a = Double.parseDouble(num1);//轉換成double類型
		double b = Double.parseDouble(num2);
		Cal cal=new Cal();
		double result = cal.add(a,b);//調用模型層方法
		req.setAttribute("add_result", result);//設置值
		req.getRequestDispatcher("add_result.jsp").forward(req, resp);//跳轉
	}
}

web.xml

  <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>controller.CalServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.action</url-pattern>
  </servlet-mapping>

代碼第一次改進思路:把doPost裏的部分代碼寫到同包AddAction.java裏,CalServlet(大管家)只實現選擇哪個java文件(小管家)完成需求。

public class AddAction {
	public String execute(HttpServletRequest request,HttpServletResponse response) {
		double a = Double.parseDouble(request.getParameter("num1"));
		double b = Double.parseDouble(request.getParameter("num2"));
		double result = new Cal().add(a, b);
		request.setAttribute("add_result", result);
		return "OK";
	}
}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		 TODO Auto-generated method stub
		String path=req.getServletPath();//獲得請求位置
		if(path.equals("/add.action")) {
			AddAction addaction = new AddAction();
			String result = addaction.execute(req, resp);
			if(result!=null){
				req.getRequestDispatcher("add_result.jsp").forward(req, resp);
			}
		}else if(path.equals("/sub.action")) {
			SubAction subaction = new SubAction();
			String result = subaction.execute(req, resp);
			if(result!=null){
				req.getRequestDispatcher("sub_result.jsp").forward(req, resp);
			}
		}
	}

代碼第二次改進思路:把加減管家的java文件公有部分可以提取出來,寫一個Action接口,兩個管家實現這個接口實現代碼減少。
controller.Action.java

public interface Action {
	public String execute(HttpServletRequest request,HttpServletResponse response);
}

controller.AddAction.java

public class AddAction implements Action{
	public String execute(HttpServletRequest request,HttpServletResponse response) {
		double a = Double.parseDouble(request.getParameter("num1"));
		double b = Double.parseDouble(request.getParameter("num2"));
		double result = new Cal().add(a, b);
		request.setAttribute("add_result", result);
		return "add_result.jsp";//返回需要跳轉到的頁面
	}
}

CalServlet.java

public class CalServlet extends HttpServlet{
	HashMap<String, Action> map = new HashMap<String, Action>();//設置請求位置與需要調用的管家對應關係
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		map.put("/add.action", new AddAction());
		map.put("/sub.action", new SubAction());
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String path = req.getServletPath();
		Action action = map.get(path);
		req.getRequestDispatcher(action.execute(req, resp)).forward(req, resp);
	}
}

整個過程 從複雜的,功能集中的代碼,變成了簡單,功能分散的代碼
CalServlet只需要必對HashMap的配置,選擇適當的小管家就可以了。

使用Struts2實現

src/action/AddAction.java

package action;

import com.opensymphony.xwork2.ActionSupport;

import model.Cal;

public class AddAction extends ActionSupport{
	private double num1;//與表單name值相同,並且有gettersetter,框架就會自己關聯兩個變量
	private double num2;
	private double result;//用來向另一個頁面回顯參數
	public double getResult() {
		return result;
	}
	public void setResult(double result) {
		this.result = result;
	}
	public double getNum1() {
		return num1;
	}
	public void setNum1(double num1) {
		this.num1 = num1;
	}
	public double getNum2() {
		return num2;
	}
	public void setNum2(double num2) {
		this.num2 = num2;
	}
	public String execute() {
		Cal cal = new Cal();
		setResult(cal.add(num1, num2));
		System.out.println(this.result);
		return SUCCESS;//該返回值用於在sructs.xml與視圖資源相映射
	}
}

web.xml

<!-- 配置Struts2核心控制器 -->
  <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>*.action</url-pattern>
  </filter-mapping>

src.structs.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- Strutes2配置文件的根元素 -->
<struts>
	<!-- Struts2的Action必須放在指定的包空間下定義 -->
	<package name="p1" namespace="/" extends="struts-default">
		<!-- 定義action,該action對應的類爲action.AddAction類 -->
		<action name="add" class="action.AddAction">
			<!-- 定義處理結果和視圖資源之間的映射關係 -->
			<result name="success">/add_result.jsp</result>
		</action>
		<!-- 定義action,該action對應的類爲action.SubAction類 -->
		<action name="sub" class="action.SubAction">
			<!-- 定義處理結果和視圖資源之間的映射關係 -->
			<result name="success">/sub_result.jsp</result>
		</action>
	</package>
</struts>

add_result.jsp

result:${result}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章