天天看點

struts2使用ServletAPI筆記

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;
	}
}
           
  • 以上三種方式在本質上是一種,都是第二種。

繼續閱讀