ExtJS实战(4)-struts

news/2024/8/27 8:49:49

既然是说SSH,那就少不了WEB层的struts.我们以前做过一个小型的HRMS,采用的是Spring自己的MVC框架。这一次,我们还是用老牌的Struts。这是一个非常简单而且容易学习的框架,如果大家对它还不是非常了解,请先参考我的相关文章。这里我们用MyEclipse开发,加入Struts的支持后,我们开发人员最主要的工作就是编写ActionActionForm类,然后再在struts-config.xml上配置ActionActionForm。我们来看看应用中主要的ActionActionForm

1. 首先是执行增加/编辑操作的Action要用到的ActionFormHouseForm。这里有个很重要的技巧,我们使用实体DTO类来做我们ActionForm的属性。这样我们在表现层和业务逻辑层之间传递数据的时候就可以非常轻松。

package org.leno.houseHire.action;

import org.apache.struts.action.ActionForm;

import org.leno.houseHire.service.HouseDTO;

public class HouseForm extends ActionForm {

private HouseDTO house = new HouseDTO();

public HouseDTO getHouse() {

return house;

}

public void setHouse(HouseDTO house) {

this.house = house;

}

}

2. 接着是执行查询列表操作用到的ActionFormSearchForm。它也同样使用实体类作为自己的属性开简化表现层和业务逻辑层之间的传值工作。

package org.leno.houseHire.action;

import org.apache.struts.action.ActionForm;

public class SearchForm extends ActionForm {

private Condition cond = new Condition();

private int start=0;

private int limit = 5;

public Condition getCond() {

return cond;

}

public void setCond(Condition cond) {

this.cond = cond;

}

public int getStart() {

return start;

}

public void setStart(int start) {

this.start = start;

}

public int getLimit() {

return limit;

}

public void setLimit(int limit) {

this.limit = limit;

}

}

package org.leno.houseHire.action;

public class Condition {

private String title;

private int room;

private int ting;

private int areaId;

private int streetId;

private double priceStart;

private double priceEnd=10000;

private String booktime;

private String sortCond = "asc";

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public int getRoom() {

return room;

}

public void setRoom(int room) {

this.room = room;

}

public int getTing() {

return ting;

}

public void setTing(int ting) {

this.ting = ting;

}

public int getAreaId() {

return areaId;

}

public void setAreaId(int areaId) {

this.areaId = areaId;

}

public double getPriceStart() {

return priceStart;

}

public void setPriceStart(double priceStart) {

this.priceStart = priceStart;

}

public double getPriceEnd() {

return priceEnd;

}

public void setPriceEnd(double priceEnd) {

this.priceEnd = priceEnd;

}

public void setBooktime(String booktime) {

this.booktime = booktime;

}

public String getBooktime() {

return booktime;

}

public String getSortCond() {

return sortCond;

}

public void setSortCond(String sortCond) {

this.sortCond = sortCond;

}

public int getStreetId() {

return streetId;

}

public void setStreetId(int streetId) {

this.streetId = streetId;

}

@Override

public String toString() {

return "标题"+title+" room:"+room+" ting "+ting+" areaId: "+areaId+" streetId "+streetId+" booktime "+booktime+" sort "+sortCond;

}

}

3. 这是我们房屋查询列表的Action,瞧瞧,代码是不是非常简洁。注意,这里和我们平常写的Action有个很大的不同:我们并没有返回指定的JSP视图或是跳转到下一个Action处理,而是直接利用网络输出流写出一个JSON数组。因为JSONJS的原生格式,我们的ExtJS对它的支持是非常好的。

package org.leno.houseHire.action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;

import net.sf.json.JSONObject;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import org.leno.houseHire.service.HouseDTO;

import org.leno.houseHire.service.IHouseService;

public class HouseSearchAction extends Action {

private IHouseService houseService;

public void setHouseService(IHouseService houseService) {

this.houseService = houseService;

}

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

SearchForm hForm = (SearchForm) form;

response.setCharacterEncoding("utf-8");

//****用实体对象做form的属性,能够大幅度减少代码量****

Condition cond = hForm.getCond();

List<HouseDTO> list = houseService.findAllHouse(cond,hForm.getStart(),hForm.getLimit());

JSONObject json = new JSONObject();

json.put("totalProperty", houseService.getTotalNums(cond));

JSONArray arr = JSONArray.fromObject(list);

json.put("root", arr);

response.getWriter().print(json);

return null;

}

}

4. 这是我们房屋信息发布或者修改的Action,它也是直接利用网络输出流写出数据。具体主要是根据客户端传过来的操作参数来调用Service层做事。

package org.leno.houseHire.action;

import java.io.PrintWriter;

import java.text.SimpleDateFormat;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import org.leno.houseHire.service.HouseDTO;

import org.leno.houseHire.service.IHouseService;

import org.leno.houseHire.service.LoginDTO;

public class HouseHandlerAction extends Action {

private IHouseService houseService;

public void setHouseService(IHouseService houseService) {

this.houseService = houseService;

}

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

response.setCharacterEncoding("utf-8");

PrintWriter pw = response.getWriter();

String action = request.getParameter("action");

HouseForm hForm = (HouseForm) form;

HouseDTO house = hForm.getHouse();

LoginDTO user = (LoginDTO) request.getSession().getAttribute("USER_INFO");

house.setUserId(user.getUid());

house.setBooktimeInfo(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));

if("addHouse".equals(action)){

pw.print(1);

houseService.addHouse(house);

}else if("editHouse".equals(action)){

pw.print(1);

houseService.editHouse(house);

}

return null;

}

}

最后来看看我们Struts框架的核心配置文件struts-config.xml吧!

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

<data-sources />

<form-beans>

<form-bean name="loginForm"

type="org.leno.houseHire.action.LoginForm">

</form-bean>

<form-bean name="searchForm"

type="org.leno.houseHire.action.SearchForm">

</form-bean>

<form-bean name="houseForm"

type="org.leno.houseHire.action.HouseForm">

</form-bean>

</form-beans>

<global-exceptions />

<global-forwards />

<action-mappings>

<action path="/login"

type="org.springframework.web.struts.DelegatingActionProxy"

name="loginForm">

</action>

<action path="/house"

type="org.springframework.web.struts.DelegatingActionProxy"

name="searchForm" scope="session">

<forward name="test" path="/index.jsp"></forward>

</action>

<action path="/houseExport"

type="org.springframework.web.struts.DelegatingActionProxy"

name="searchForm" scope="session">

</action>

<action path="/houseHandler"

type="org.springframework.web.struts.DelegatingActionProxy"

name="houseForm" scope="session">

</action>

</action-mappings>

<message-resources

parameter="org.leno.houseHire.action.ApplicationResources" />

</struts-config>

注意,我们这里Action配置元素的type属性节点,以前我们不是直接配置类的完整名字吗?现在的这个类型是什么?我们回想我们的Spring的核心配置里面好像已经配置了这些ActionBean,也就是说,struts框架里面最重要的类Action都委托给Spring去管理了。(当然主要是为了借助它强大的IOCAOP的能力!),这里要注意的是Actionpath属性要和applicationContext.xml中配置的beanname属性一致!


http://www.niftyadmin.cn/n/2891599.html

相关文章

DAPP 开发直通车-如何基于NEL 轻钱包来开发DAPP

之前做了 DAPP 开发直通车&#xff0c;通讲了一下开发一个DAPP的过程。但是涉及多工种&#xff0c;多步骤。入手还是非常困难的。经过不懈的努力&#xff0c;做了很多铺垫工作之后&#xff0c;我终于可以告诉你&#xff1a;开发DAPP for NEO&#xff0c;从未如此简单绿谷镇楼。…

C++11 条件变量类

0.引入 本文选自《C并发实战-第二版》附录D-线程类参考-D.2 <condition_variable>头文件 1.<condition_variable>头文件 <condition_variable>头文件提供了条件变量的定义。其作为基本同步机制&#xff0c;允许被阻塞的线程在某些条件达成或超时时&#xf…

二、Java面向对象(8)_继承思想——继承关系

2018-05-01 劳动是为了更好的享受生活。 继承思想 一、继承的概念 继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类&#xff0c;新的类能吸收已有类的某些数据属性和行为&#xff0c;并能扩展新的能力。 继承就是子类继承父类的特征和行为&#xff0c;使得子类…

知识点汇总

Java JWT token 什么是token认证&#xff1f; 基于token的用户认证是一种服务端无状态的认证方式&#xff0c;所谓服务端无状态指的token本身包含登录用户所有的相关数据&#xff0c;而客户端在认证后的每次请求都会携带token&#xff0c;因此服务器端无需存放token数据。 当用…

ExtJS实战(5)-dwr

SSH这三个巨擘已经现身了&#xff0c;接下来就轮到我们小型的AJAX框架DWR了。做好DWR的准备工作&#xff1a;导入JAR包->在web.xml配置核心Servlet->编写核心配置文件dwr.xml,我在前面的应用中已经详细介绍过DWR&#xff0c;这里就简单地说一下。DWR是一个JAVA世界里的AJ…

button和submit的区别

button-普通按钮&#xff0c;submit-提交按钮。  submit是button的一个特例&#xff0c;也是button的一种&#xff0c;它把提交这个动作自动集成了&#xff0c;submit和button,二者都以按钮的形式展现,看起来都是按钮&#xff0c;所不同的是type属性和处发响应的事件上。 使用…

【无标题】-一次失败的尝试

南大的下载镜像 libkqueue-dev yum install libtalloc-devel -y ./configure checking for _talloc in -ltalloc... yes checking for _talloc_pooled_object... yes checking for kqueue... no checking for kqueue in -lkqueue... no checking for kqueue in -lkqueue in …

linux基础-统计命令:wc

wc [选项] 文件 -c 统计字节数。 -l 统计行数。 -m 统计字符数。这个标志不能与 -c 标志一起使用。 -w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。 -L 打印最长行的长度。 -help 显示帮助信息 --version 显示版本信息 统计指定文件中的字节数、字数、行…