在上篇写的用户登录验证案例的基础上进一步改进。

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>

Struts1.3——登录案例的改进的更多相关文章

  1. Android first---文件读取(登录案例编写为主)

    以android登录案例来介绍文件的读取与androidAPI给予的方法 第一步:绘制界面 绘制方法:在线性布局下面设置相对布局 代码部分: <LinearLayout xmlns:androi ...

  2. ADO.NET学习系列(三)----做一个登录案例

    总体思路.根据用户输入的用户名和密码,来判断,和数据库里面存的是不是一样,如果一样就表明登录成功,否则就登录失败. 方案一: 1.select* from 表名 where username=&quo ...

  3. 基于Struts2框架实现登录案例 之 使用Struts2标签库简化表单+继承ActionSupport完成输入交验

    一,使用Struts2标签库简化表单 在文章[基于Struts2框架实现登录案例]的基础上,通过使用Struts标签库可以简化登录页面login2.jsp <%@ page language=& ...

  4. 简单登录案例(SharedPreferences存储账户信息)&联网请求图片并下载到SD卡(文件外部存储)

    新人刚学习Android两周,写一个随笔算是对两周学习成果的巩固,不足之处欢迎各位建议和完善. 这次写的是一个简单登录案例,大概功能如下: 注册的账户信息用SharedPreferences存储: 登 ...

  5. Android(java)学习笔记213:开源框架post和get方式提交数据(qq登录案例)

    1.前面提到Http的get/post方式  . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2.Android应用会经常使用http协议进行传输,网上会有很完善 ...

  6. Android(java)学习笔记212:中文乱码的问题处理(qq登录案例)

    1.我们在之前的笔记中LoginServlet.java中,我们Tomcat服务器回复给客户端的数据是英文的"Login Success","Login Failed&q ...

  7. C#学习笔记(35)——事件做的登录案例

    说明(2018-4-9 20:11:42): 1. 先自定义了一个登录控件,可以输入账号.密码,点击登录.然后在Form1里面拖入这个控件,要求输入账号密码正确时,点击登录,控件显示绿色,否则显示红色 ...

  8. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...

  9. Android(java)学习笔记156:开源框架post和get方式提交数据(qq登录案例)

    1. 前面提到Http的get/post方式  . HttpClient方式,实际工作的时候不常用到,因为这些方式编写代码是很麻烦的 2. Android应用会经常使用http协议进行传输,网上会有很 ...

随机推荐

  1. Oralce常用系统函数

    dual:Oracle系统内部提供的一个用于实现临时数据计算的特殊表,它只有一个列DUMMY (VARCHAR2(1)) 字符类函数: concat--连接字符串 initcap--每个单词首字母大写 ...

  2. python- ' % '运算符的用途(非常重要)

    %运算符就是用来格式化字符串的. 在字符串内部, %s表示用字符串替换, %d表示用整数替换, 有几个%?占位符,后面就跟几个变量或者值,顺序要对应好. 如果只有一个%?,括号可以省略. 另一种格式化 ...

  3. [360前端星计划]BlackJack(21点)(纯JS,附总部学习笔记)

    [360前端星计划]总部学习笔记(6/6) [360前端星计划]详情跳转 游戏界面预览 目录 一.游戏介绍 1.起源 2.规则 3.技巧 二.游戏设计 1.整体UI构思 2.素材采集 3.游戏总规划 ...

  4. eclipse搭建jmeter编译环境(Jmeter二次开发)

    jmeter是开源项目,方便大家对代码进行改动. 写了一个简单教程,帮助入门者进行搭建jmeter编译环境! 下载地址 文件格式为zip,解压后为docx微软office2007文档. 或者直接访问我 ...

  5. Cocos2d 之FlyBird开发---GameData类

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 现在是大数据的时代,绝大多数的游戏也都离不开游戏数据的控制,简单的就是一般记录游戏的得分情况,高端大气上档次一点的就是记录和保存各方面的游 ...

  6. 一些关于SEO优化的笔记

    高级搜索指令: 双引号:“xxx” 代表完全匹配的搜索 减号:-(减号前面必须是空格,后面必须没有空格)代表搜索不包含减号后面的词的页面 filetype:用于搜索特定文件格式(百度支持的文件类型:P ...

  7. mysql数值字符串类型的按照数值进行排序

    今天遇到一个问题,就是对mysql数值字符串类型进行排序,在默认情况下使用order by 字段名称 desc/asc 进行排序的时候,mysql进行的排序规则是按照ASCII码进行排序的,并不会自动 ...

  8. 委托的异步编程和同步编程的使用( Invoke 和BeginInvoke)

    一,区别: 使用Invoke完成一个委托方法的封送,就类似于使用SendMessage方法来给界面线程发送消息,是一个同步方法.也就是说在Invoke封送的方法被执行完毕前,Invoke方法不会返回, ...

  9. vue项目的脚手架

    > cnpm i @vue/cli@3 -g > vue create myapp * 选择 Manually select features ----- 自选预设文件 * 选择 vue ...

  10. 五、通过密码访问API

    通过密码访问API 一.客户端 图: 客户端请求代码: static void Main(string[] args) { Console.WriteLine("确定三个项目都已经启动&qu ...