參考資料: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}