ServletAPI
在struts2的開發中,依然需要使用到servlet的api,比如:使用者的登入後需要将使用者資訊儲存到session中。在struts2中有兩種方式可以擷取servlet的api,一種是解耦方式,一種是耦合方式。
解耦方式
- web.xml
<!-- struts2的前端控制器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
- 配置檔案
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="com.x.action.LoginAction" method="login">
<result name="success">/success.jsp</result>
<result name="login">/login.jsp</result>
</action>
</package>
</struts>
- 實體類
public class User {
//保證有無參構造方法
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- 處理類
public class LoginAction implements ModelDriven<User>{
private User user = new User();
public User getModel() {
return user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//處理登入業務
public String login() {
if("zs".equals(user.getUsername()) && "111".equals(user.getPassword())) {
//使用者登入成功,将使用者資訊寫入session
ActionContext.getContext().getSession().put("currentuser", user);
//擷取application
ActionContext.getContext().getApplication();
//擷取request
Map<String, Object> req = (Map<String, Object>) ActionContext.getContext().get("request");
req.put("pwd", user.getPassword());
return "success";
}else {
return Action.LOGIN;
}
}
}
- 頁面
<body>
<form action="login.action" method="post">
username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
<input type="submit">
</form>
</body>
<body>
登入成功,歡迎${sessionScope.currentuser.username }
</body>
耦合方式,通過servletapi
- ①直接通過ServletActionContext來擷取
//處理登入業務
public String login() {
if("zs".equals(user.getUsername()) && "111".equals(user.getPassword())) {
//使用者登入成功
HttpServletRequest req = ServletActionContext.getRequest();
req.getSession().setAttribute("currentuser", user);
return "success";
}else {
return Action.LOGIN;
}
}
- ②通過ActionContext對象擷取HttpServletContext對象
//處理登入業務
public String login() {
if("zs".equals(user.getUsername()) && "111".equals(user.getPassword())) {
//使用者登入成功
HttpServletRequest req = (HttpServletRequest) ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
req.getSession().setAttribute("currentuser", user);
return "success";
}else {
return Action.LOGIN;
}
}
- ③通過IOC方式直接擷取servletapi對象
實作接口 ServletRequestAware
擷取request對象
public class LoginAction implements ModelDriven<User>,ServletRequestAware{
private User user = new User();
private HttpServletRequest req;
//處理登入業務
public String login() {
if("zs".equals(user.getUsername()) && "111".equals(user.getPassword())) {
//使用者登入成功
req.getSession().setAttribute("currentuser", user);
return "success";
}else {
return Action.LOGIN;
}
}
@Override
//有IOC注入request對象
public void setServletRequest(HttpServletRequest request) {
this.req = request;
}
public User getModel() {
return user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
- 以上三種方式在本質上是一種,都是第二種。