慕粉4325608
2017-08-15 17:20
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--定义常量 -->
<!-- 禁用动态调用方法 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<constant name="struts.devMode" value="true"></constant>
<package name="default" namespace="/" extends="struts-default">
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="auth" class="com.imooc.intercepter.AuthIntercepter"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="auth"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 通过此Action访问后台管理页面 ,需要判断用户是否已登录,如果未登录则跳转到登录页面-->
<action name="auth">
<result>/WEB-INF/page/manager.jsp</result>
<result name="login">/lo.jsp</result>
<!-- 引用自定义的拦截器栈 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
<action name="login" class="com.imooc.action.LoginAction" method="login">
<result name="success">/WEB-INF/page/manager.jsp</result>
<result name="error">/lo.jsp</result>
</action>
</package>
</struts>
LoginAction.class
package com.imooc.action;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport implements SessionAware{
private String uname ;
private String upwd;
private Map<String, Object> session;
//获取session
public void setSession(Map<String,Object> session) {
this.session = session;
}
public String getName() {
return uname;
}
public void setName(String name) {
this.uname = name;
}
public String getPassword() {
return upwd;
}
public void setPassword(String password) {
this.upwd = password;
}
// 处理login的问题
public String login(){
if("admin".equals(uname) && "123456".equals(upwd)){
session.put("loginInfo", uname);
return SUCCESS;
}else{
session.put("loginError","用户名或密码错误!");
return ERROR;
}
}
}
AuthInterceptor.class
public class AuthIntercepter extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = ActionContext.getContext();
Map<String,Object> session = context.getSession();
if(session.get("loginInfo")!=null){
String result = invocation.invoke();
return result;
}else{
return "login";
}
}
}
同学,你需要将LoginAction中用于接收用户名和密码的属性名称和login.jsp页面表单中所提交的用户名与密码的input输入框中的name属性名称一致才能够成功利用Struts2的属性驱动来完成属性的封装噢.
注意上面调到的属性名并不是你在LoginAction中声明的字段名称,而是getter/setter方法名称去掉get/set后的名称,首字母小写后需要保证与你在login.jsp页面的表单中的参数名称一致.
例如:
login.jsp
<form action="login.action" method="post" name="loginForm" > 用户名:<input type="text" name="username" /><br/> 密码:<input type="password" name="password" ><br/> 登录按钮... </form>
可以看到在表单中两个input标签中的name属性分别为 username 和 password
接下来再看一下LoginAction:
public class LoginAction extends ActionSupport {
// 利用属性驱动来封装访问该Action中携带的参数
private String username; // 这边的字段名并不是一定要与表单中的参数名称一致,但是为了满足规范还是建议写成一致的.
private String password;
// 接下来就是提供set方法来进行参数封装
// 这里可以看到将set去掉以后那么就只剩下Username了, 然后首字母改为小写就是 username
// 这个就是你的属性名称,只有属性名称与请求参数的名称一致才能够利用属性驱动进行赋值噢.
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}建议你去检查一下login.jsp页面中的请求参数的name属性名称和LoginAction中的接收参数的属性名称是否一致.
Struts2拦截器浅析
37976 学习 · 121 问题
相似问题