Những vấn đề về Struts2 Framework
//VD: về tạo nút bấm chỉnh sửa dữ liệu struts 2 (Hình ảnh phía trên) <%@taglib uri="/struts-tags" prefix="s"%> <s:form action="amend" method="POST"> <tr> <th>STT</th> <th>Emp Name</th> <th>Salary</th> <th>Depart</th> <th>Amend</th> <th><input type="submit" value="Amend"></th> </tr> <s:iterator var="L" value="list" status="No" begin="1" end="10" >//Có thể dùng Begin và End <tr> <td><s:property value="#No.count"/></td> //Đếm số thứ tự <td><s:property value="#L.employeename"/></td>//Lấy giá trị từ List <td><s:property value="#L.salary" /></td> <td><s:property value="#L.departmentname" /></td> <td><a href="amend?empID=<s:property value="%{empID}"/>"><input type="button" value="Amend"></a></td> <th><input type="radio" name="empID" value="<s:property value="%{empID}"/>"></th> </tr> </s:iterator> </s:form>
Welcome <s:property value="%{#session.logined}"/> <s:if test="#session.logined != null"> <s:url id="logout" action="logout" /> <s:a href="%{logout}" >Logout</s:a> </s:if>
//Tòn tại với lần gọi
Map request = (Map) ActionContext.getContext().get("request");
//Tồn tại trong cả phiên làm việc của máy tính
Map session = ActionContext.getContext().getSession();
//Tồn tại trong suốt thời gian sống của server
Map application = ActionContext.getContext().getApplication();
//Cách set giá trị cho Map
request.put("key", "value-string or object");
session.put("AN", accName);
request.put("loginFail", "Dang nhap that bai! Kiem tra lai accname hoac password");
//Cách get giá trị cho Map
request.get("key").toString();
String accN = session.get("AN").toString(); -> Java
<s:if test="#request.loginFail != null"> -> Jsp
<!-- Thong bao login fail -->
<font color="red"> <s:property value="#request.loginFail" /></font>
</s:if>
//Cách dùng ValueStack
ValueStack stack = ServletActionContext.getContext().getValueStack();
//Dùng Map để lưu giá trị theo key để dễ dàng lấy ra khi cần
Map<String, Object> context = new HashMap<String, Object>();
context.put("user","LonelyCat");
//Đẩy map vào ValueStack
stack.push(context);
//Hiển thị
<s:property value="user"/>
Chú ý: Sửa lỗi khi sử dụng Validation Chuyển trang không chạy ============================================================= click vào đây để xem cách Validation XML (tôi thích dùng nó) click vào đây để xem cách Validation @override method validate() ========================================================================= - [1] struts.xml bạn thêm <result name="input">amend.jsp</result> - [2] Thêm struts-config.xml Copy file struts.xml vào WEB-INF paste và đổi tên thành struts-config.xml ========================================================================= ////////////////// Điểm chung nhất của validation ////////////////// ========================================================================= - [1] extends ActionSuppor - [2] Trang jsp cần thêm thẻ <s:head/> để show message
<a href="detail?accName=<s:property value="#session.accName" />">
<input type="button" value="Xem thong tin da nhap">
</a>
<?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="default" extends="struts-default" namespace="/">
<action name="detail" class="com.demo.action.DetailA">
<result name="success">detail.jsp</result>
<result name="error">/detail.jsp</result>
</action>
</package>
</struts>
public class DetailA {
private String accName;
private Account acc;
// setter getter cho class Action cua struts2
public String execute() {
AccountDao a = new AccountDao();
acc = a.viewDetail(accName);
if (acc != null) {
return "success";
} else {
return "error";
}
}
}
<%@ taglib prefix="s" uri="/struts-tags"%>
Account Name: <s:property value="%{acc.accName}" /><br/>
Password: <s:property value="%{acc.password}" /><br/>
FirstName: <s:property value="%{acc.firstName}" /><br/>
LastName: <s:property value="%{acc.lastName}" /><br/>
Email: <s:property value="%{acc.email}" /><br/>
<s:if test="%{false}"> <div>Will Not Be Executed</div> </s:if> <s:elseif test="%{true}"> <div>Will Be Executed</div> </s:elseif> <s:else> <div>Will Not Be Executed</div> </s:else>
public String execute() throws Exception { if ("admin".equals(userId) && "password".equals(passwd)) { // HttpSession session = ServletActionContext.getRequest().getSession(); // session.setAttribute("logined","true"); // session.setAttribute("context", new Date()); // Better is using ActionContext Map session = ActionContext.getContext().getSession(); session.put("logined","admin"); session.put("context", new Date()); return SUCCESS; } return ERROR; } public String logout() throws Exception { // HttpSession session = ServletActionContext.getRequest().getSession(); // session.removeAttribute("logined"); // session.removeAttribute("context"); Map session = ActionContext.getContext().getSession(); session.remove("logined"); session.remove("context"); return SUCCESS; }
<action name="refundmain" class="com.test.MainAction"> <result name="success" type="redirectAction" >refunfinfo.action</result> </action> <action name="login" class="simple.LoginAction" > <result name="success" type="dispatcher">/pages/welcome.jsp</result> <result name="next" type="redirectAction">${nextAction}</result> </action> //Di chuyển đến trang mới url không có action.abc <action name="logout" class="controller.LogoutAction"> <result name="success" type="redirect">login.jsp</result> </action>
<%@taglib uri="/struts-tags" prefix="s" %>
LoginAction.java
@Override
public String execute() throws Exception {
ProductDAO p = new ProductDAO();
if (p.checkLogin(username, password)) {
Map session = ActionContext.getContext().getSession();
session.put("logined", username);
list = p.getList();
return "success";
}
return "fail";
}
welcome.jsp
<s:iterator var="L" value="list" status="number">
<tr>
<td><s:property value="#number.count"/></td>
<td><s:property value="#L.id"/></td>
<td><s:property value="#L.name"/></td>
<td><s:property value="%{details}"/></td>
</tr>
</s:iterator>
JSTL
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:forEach var="in" items="${list}" varStatus="count">
<c:out value="${count.index}"/> //Đến số thứ tự
<c:out value="${in.name}"/>
</c:forEach>
Hiển thị không cần login
<% List<Product> L = (new ProductDAO()).getAll(); %>
<% request.setAttribute("LT", L); %>
<c:forEach items="${LT}" var="in">
....
</c:forEach>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:forTokens items="Zara,nuha,roshy" delims="," var="name">
<c:out value="${name}"/><p>
</c:forTokens>
@Override
public String execute() {
return (user == null) ? INPUT : SUCCESS;
}
//Viết CSS cho struts 2 =>> cssClass="button"
Tạo và Hiển thị thông báo cho người dùng biết
Display Message login fail Struts2
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
private String username;
private String password;
//set and get
//business logic
public String execute() {
return "SUCCESS";
}
//simple validation
public void validate(){
if("username".equals(getUsername())){
addActionMessage("Succsess you are valid user!");
}else{
addActionError("I don't know you, dont try to hack me!");
}
}
}
show message >> login.jsp
<s:if test="hasActionErrors()">
<div class="errors">
<s:actionerror/>
</div>
</s:if>
show message >> Welcome.jsp
<s:if test="hasActionMessages()">
<div class="welcome">
<s:actionmessage/>
</div>
</s:if>
public void validate() {
if (userName.isEmpty()) {
addFieldError("userName", "Username can't be blank");
}
if (password.isEmpty()) {
addFieldError("password", "Password Can't be blank");
}
else {
addActionMessage("Welcome " + userName + ", You have been Successfully Logged in");
}
}
}
//Hiển thị kiểu Date thay property
<s:date name="#L.paymentDate" format="dd/MM/yyyy"/>
//Hiển thị số tiền theo định dạng 1,000.00
<s:property value="getText('{0,number,#,##0.00}',{#List.TotalAmt})" />
//Hiển thị định dạng tiền tệ struts 2
//Trong strust 2 có thể dùng thư viện JSTL
//Sử dụng API jstl-1.2.jsp tomcat v7.0 - Java 1.7
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<s:set var="paymentAmt" value="#List.paymentAmt"/>
<td><fmt:formatNumber
pattern="#,##0.00" value="${paymentAmt}"/></td>
//Cần tìm hiểu về Token Iterceptor không cho call lại url gọi action double Struts2 Token Interceptor
0 nhận xét:
Post a Comment