struts的解耦合与耦合(Struts2访问Servlet API)
struts的解耦合与耦合都是基于struts基础案例的,所以前面的引入依赖等就不一一列举了。
解耦合
解耦就是把代码的关键逻辑脱离耦合,也就是这一部分代码可以脱离struts2使用。当然不可能全部解耦,例如和画面相关的部分不可能解耦。但是核心逻辑脱离是很简单的。
第一种方法
servlet api解耦合方法一 对Servlet API进行封装,借助ActionContext
定制Action 要想让一个类成为action就应该继承Action
public class UserInfo {
    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;
    }
}
action方法
public class LoginBeanLoginModel01 implements Action,ModelDriven<UserInfo> {
    private UserInfo info=new UserInfo();
    public String execute() throws Exception {
        if (info.getUsername().equals("admin")&& info.getPassword().equals("admin")){
            // 获取session对象
            Map<String, Object> map = ActionContext.getContext().getSession();
            map.put("username",info.getUsername());
            //获取application对象
            Map<String, Object> application = ActionContext.getContext().getApplication();
            application.put("user",info.getUsername());
            //获取request对象
            ActionContext context = ActionContext.getContext();
           context.put("users",info.getUsername());
            return SUCCESS;
        }else {
            return LOGIN;
        }
    }
    public UserInfo getModel() {
        return info;
    }
    public UserInfo getInfo() {
        return info;
    }
    public void setInfo(UserInfo info) {
        this.info = info;
    }
}
struts.xml的action
<action name="loginbeanmodel01" class="cn.sjl.day01.controller.LoginBeanLoginModel01">
<result name="success">day01/success.jsp</result>
<result name="login">day01/loginbeanmodel01.jsp</result>
</action>
jsp页面
<%@taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<s:form name="form1" namespace="/" method="post" action="loginbeanmodel01">
请输入用户名: <s:textfield name="username"></s:textfield> <br/>
<s:password name="password"></s:password><br/>
<s:submit value="登陆"></s:submit>
</s:form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>成功 </title>
</head>
<body>
登录成功${username},${user},${users}
</body>
</html>


第二种方法
servlet api解耦合方法二 向Action中注入ServletAPI对象对应的Map对象
Struts2向Action注入ServletAPI对象对应的Map对象 实现SessionAware
定制Action
public class UserInfo {
    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;
    }
}
action方法
public class LoginBeanLoginModel02 implements Action,ModelDriven<UserInfo>,SessionAware{
    private Map<String, Object> map;
    private UserInfo info=new UserInfo();
    public String execute() throws Exception {
        if (info.getUsername().equals("admin")&& info.getPassword().equals("admin")){
            map.put("username",info.getUsername());
            return SUCCESS;
        }else {
            return LOGIN;
        }
    }
    public UserInfo getModel() {
        return info;
    }
    public UserInfo getInfo() {
        return info;
    }
    public void setInfo(UserInfo info) {
        this.info = info;
    }
    public void setSession(Map<String, Object> map) {
        this.map=map;
    }
}
struts.xml的action
<action name="loginbeanmodel02" class="cn.sjl.day01.controller.LoginBeanLoginModel02">
<result name="success">day01/success.jsp</result>
<result name="login">day01/loginbeanmodel02.jsp</result>
</action>
jsp页面
<%@taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<s:form name="form1" namespace="/" method="post" action="loginbeanmodel02">
请输入用户名: <s:textfield name="username"></s:textfield> <br/>
<s:password name="password"></s:password><br/>
<s:submit value="登陆"></s:submit>
</s:form>
</body>
</html>
耦合
耦合是指紧密结合的意思。简单的理解,如果你使用了或者继承了j2ee的部分,那么你的代码在非j2ee环境就不能使用。你使用了struts2的包和类,那么你的代码在spring mvc中就不可用。
第一种方法
通过ActionContext的子类ServletActionContext实现
定制Action
public class UserInfo {
    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;
    }
}
action方法
public class LoginBeanLoginModel03 implements Action{
    private UserInfo info;
    public String execute() throws Exception {
        if (info.getUsername().equals("admin")&& info.getPassword().equals("admin")){
            HttpSession session = ServletActionContext.getRequest().getSession();
            session.setAttribute("username",info.getUsername());
            return SUCCESS;
        }else {
            return LOGIN;
        }
    }
    public UserInfo getInfo() {
        return info;
    }
    public void setInfo(UserInfo info) {
        this.info = info;
    }
}
struts.xml的action配置文件
<action name="loginbeanservlet01" class="cn.sjl.day01.controller.LoginBeanLoginModel03">
<result name="success">day01/success.jsp</result>
<result name="login">day01/loginbeanservlet01.jsp</result>
</action>
jsp页面
<%@taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<s:form name="form1" namespace="/" method="post" action="loginbeanservlet01">
请输入用户名: <s:textfield name="info.username"></s:textfield> <br/>
<s:password name="info.password"></s:password><br/>
<s:submit value="登陆"></s:submit>
</s:form>
</body>
</html>
第二种方法
向Action实例注入Servlet API对象  继承ServletRequestAware
定制Action
public class UserInfo {
    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;
    }
}
acction方法
public class LoginBeanLoginModel04 implements Action,ServletRequestAware{
    private UserInfo info;
    private HttpServletRequest request;
    public String execute() throws Exception {
        if (info.getUsername().equals("admin")&& info.getPassword().equals("admin")){
            HttpSession session = request.getSession();
            session.setAttribute("user",info.getUsername());
            return SUCCESS;
        }else {
            return LOGIN;
        }
    }
    public void setServletRequest(HttpServletRequest httpServletRequest) {
             this.request=httpServletRequest;
    }
    public UserInfo getInfo() {
        return info;
    }
    public void setInfo(UserInfo info) {
        this.info = info;
    }
}
struts.xml的action配置文件
<action name="loginbeanservlet02" class="cn.sjl.day01.controller.LoginBeanLoginModel04">
<result name="success">day01/success.jsp</result>
<result name="login">day01/loginbeanservlet02.jsp</result>
</action>
jsp页面
<%@taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<s:form name="form1" namespace="/" method="post" action="loginbeanservlet02">
请输入用户名: <s:textfield name="info.username"></s:textfield> <br/>
<s:password name="info.password"></s:password><br/>
<s:submit value="登陆"></s:submit>
</s:form>
</body>
</html>
 访问方式和第一个类似,这里就不一一写出来了。以上就是struts2的解耦合与耦合的方法。
 
 
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号