在上篇写的用户登录验证案例的基础上进一步改进。
1.在登录成功后的welcome.jsp页面显示登录成功的用户名
思路1:在LoginAction中,将username放入request的域对象中
因为,ActionMapping的findForward()
方法实质上是请求转发,所以可以把username放入request的域对象中,如下:
public class LoginAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { UserForm userForm = (UserForm)form; System.out.println("用户名="+userForm.getUsername()); System.out.println("密码="+userForm.getPassword()); if("123".equals(userForm.getPassword())){ // 把名字存入request域对象,因为findForward是转发,所以可以存到request对象中 request.setAttribute("username", userForm.getUsername()); return mapping.findForward("ok"); }else{ return mapping.findForward("error"); } } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
然后,在welcome.jsp页面将request域对象中的username取出来即可,如下:
<body>
Welcome! <br>
<%--把username取出来 --%> <%=request.getAttribute("username").toString() %> <br><a href="/strutslogin">返回重新登录</a> </body>
- 1
- 2
- 3
- 4
- 5
- 6
但实际上,在struts中并不需要这么做,我们只需要在struts-config.xml文件中简单配置Action,就可以把UserForm这个表单的对象放入request或者session域对象中:
思路2:直接在struts-config.xml中配置Action,添加scope元素,指定表单的生命周期
<action path="/login" name="userForm" scope="request" type="com.gavin.actions.LoginAction"> <forward name="ok" path="/WEB-INF/welcome.jsp"/> <forward name="error" path="/WEB-INF/error.jsp"/> </action>
- 1
- 2
- 3
- 4
注意,如果不在action中配置scope属性,它也是默认存在的,并且默认取值为session
。
在这里: scope="request"
,相当于这样一句话:request.setAttribute("userForm",userForm)
scope="session"
,相当于:request.getSession().setAttribute("userForm",userForm)
如果,我们在这里配置了scope属性,那么就相当于把userForm表单对象实例放入了request的域对象,这时候我们的welcome.jsp需要这么写:
<body>
Welcome! <br>
<%--取出userForm对象,然后获取username --%> <%=((UserForm)request.getAttribute("userForm")).getUsername()%> <br><a href="/strutslogin">返回重新登录</a> </body>
- 1
- 2
- 3
- 4
- 5
- 6
2.中文乱码问题处理
在测试的过程中,发现如果用户名出现了中文,会产生中文乱码问题。
在struts中,我们必须使用filter(过滤器)来解决struts中的中文乱码问题
步骤如下:
开发一个过滤器EncodingFilter,并设置它的request.setCharacterEncoding("utf-8")
即可
public class EncodingFilter extends HttpServlet implements Filter { @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // 在这里设置接收编码 arg0.setCharacterEncoding("utf-8"); arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
然后在web.xml文件中配置该过滤器,使访问所有的页面都要经过该过滤器,如下:
<filter>
<filter-name>EncodingFilter</filter-name> <filter-class>com.gavin.filters.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3.Action是单态的
单态的含义:单态是指在整个程序运行的过程中,始终是一个对象在运行、在为我们服务。
也就是说我们的LoginAction只被实例化一次,之后的所有访问都由这个对象来处理。
4.关于struts-config.xml文件
- 它的路径不一定非要放在WEB-INF目录下面,也可以自己随意放置,但一般上是放在WEB-INF目录下
- 那么在一个项目中,能不能有多个struts-config.xml配置文件呢?
答案是可以的。
如果有两份配置文件,它仍然是由一个总控制器ActionServlet管理的,假设有struts-config.xml,struts-config2.xml两个配置文件,那么它们是这样配置的:
<servlet>
<servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config2.xml</param-value> </init-param> </servlet>