public class UserAction extends ActionSupport implements ModelDriven<User> {
@Autowired private UserService userService;
private User user = new User();
private int page = 1, rows = 10; // easyui 分頁參數
private Map<String, Object> result = new HashMap<>();
public String list() {
PageBounds pageBounds = new PageBounds(page, rows);
List<User> list = userService.findByPage(user, pageBounds);
PageList<User> pageList = (PageList<User>) list;
result.put("total", pageList.getPaginator().getTotalCount());
result.put("rows", list);
return SUCCESS; // struts2-json-plugin 自動序列化 result
}
// getter/setter ...
}
@Service
public class UserServiceImpl implements UserService {
@Autowired private UserDAO userDAO;
public List<User> findByPage(User query, PageBounds pageBounds) {
return userDAO.findByPage(query, pageBounds);
}
}
@Repository
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
public List<User> findByPage(User query, PageBounds pageBounds) {
StringBuilder hql = new StringBuilder("FROM User u WHERE 1=1");
List<Object> params = new ArrayList<>();
if (StringUtils.isNotBlank(query.getUsername())) {
hql.append(" AND u.username LIKE ?");
params.add("%" + query.getUsername() + "%");
}
Query q = getSession().createQuery(hql.toString());
for (int i = 0; i < params.size(); i++) q.setParameter(i, params.get(i));
// PageHelper 自動攔截 LIMIT/OFFSET
return q.list();
}
}
// Action
public String register() {
if (userService.exists(user.getUsername())) {
result.put("success", false);
result.put("msg", "用戶名已存在");
} else {
userService.save(user);
result.put("success", true);
}
return SUCCESS;
}
public String login() {
User dbUser = userService.findByUsername(user.getUsername());
if (dbUser != null && passwordEncoder.matches(user.getPassword(), dbUser.getPassword())) {
ActionContext.getContext().getSession().put("USER", dbUser);
result.put("success", true);
} else {
result.put("success", false);
result.put("msg", "用戶名或密碼錯誤");
}
return SUCCESS;
}
// 異步分頁表格 (EasyUI DataGrid)
$('#dg').datagrid({
url: 'user_list.action',
pagination: true,
pageSize: 10,
columns: [[
{field:'username',title:'用戶名',width:100},
{field:'email',title:'郵箱',width:200}
]]
});
// 註冊表單提交
$('#regForm').form({
url: 'user_register.action',
onSubmit: function() { return $(this).form('validate'); },
success: function(data) {
var res = JSON.parse(data);
$.messager.alert('提示', res.msg);
if (res.success) $('#regDlg').dialog('close');
}
});
struts.xml 配置 json 結果類型,Action 返回 Map/List 直接序列化。@Transactional 標註業務方法。PageBounds (PageHelper) 實現物理分頁,避免全表掃描。BCryptPasswordEncoder。完整可運行項目(含 SQL、配置、前端頁面):百度文檔下載