一、本节说明
进入github下载本项目(开源)
本节实现登录、注册的逻辑以及UI。
二、Struts相关配置
在使用Struts前必选先配置Struts。
Step1:引入Struts所需jar包
如果没有引入,请参考:Struts2项目实战 微云盘(二):项目结构
Step2:配置Struts的核心Filter
在WEB-INF新建web.xml文件修改为如下格式:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_1.xsd"version="3.1"><!-- 定义sruts2的核心Filter --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><!-- 拦截所有请求 --><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>
Step3:Struts配置文件
在src路径下创建struts.xml文件,struts.xml负责配置控制器、拦截器、异常等一系列与Struts有关的东西,以下代码只创建了一个包,修改为如下格式:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><!-- 允许动态方法调用 --><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant><constant name="struts.ognl.allowStaticMethodAccess" value="true" /><constant name="struts.il8n.encoding" value="UTF-8" /><package name="lzf" namespace="/" extends="struts-default"><!--这里配置Action--><!--匹配所有请求Action--><action name="*"><result>/WEB-INF/content/{1}.jsp</result></action></package></struts>
三、注册功能
网页收集用户注册信息->提交给注册控制器->控制器调用业务逻辑组件实现用户注册->返回逻辑视图名->struts根据逻辑视图名与资源视图的映射关系转向对应的资源视图
Step1:实现控制器
RegisterAction类是注册的控制器,负责调用业务逻辑组件。它继承自ActionSupport,在RegisterAction中封装了User对象的属性用来接收请求传过来的参数,这几个属性以及setter、getter方法与User对象中属性相同,所以不再细说,对用户请求的处理要放在execute()方法中,该方法返回逻辑视图名。
该控制器的代码很简单,通过ServiceImpl对象调用用户注册方法,如果注册成功,返回SUCCESS,否则返回ERROR。
这里的SUCCESS和ERROR都是逻辑视图名
@Overridepublic String execute() throws Exception {ServiceImpl serviceImpl=new ServiceImpl();boolean result=serviceImpl.register(username, password, sex, age, phone);if(result) return SUCCESS;else return ERROR;}
Step2:配置Action
仅仅实现了Action还不够,还需要在struts.xml中配置该Action。
<!-- 注册Action --><action name="registerAction" class="cn.lzf.action.RegisterAction"><result name="error">/WEB-INF/content/register_err.jsp</result><result>/WEB-INF/content/register_succ.jsp</result></action>
Step3:注册界面
第2步中配置两种逻辑视图与资源视图的映射关系,所以我们需要先定义注册页面register.jsp,还要定义register_err.jsp、register_succ.jsp。
register_err.jsp、register_succ.jsp这两个页面比较简单
<!--注册失败页面 register_err.jsp--><body>注册失败!</body>
<!--注册成功页面 register_succ.jsp--><body>注册成功!<a href="login">去登录</a></body>
register.jsp页面也没什么可说的,就一个表单提交给registerAction:
<s:form action="registerAction" id="form1"><s:textfield label="用户名" name="username"></s:textfield><s:password label="密码" name="password"></s:password><s:radio list="{'男','女'}" name="sex"></s:radio><s:textfield label="年龄" name="age"></s:textfield><s:textfield label="电话" name="phone"></s:textfield><s:submit value="注册账号" id="submit"></s:submit></s:form>
div垂直居中解决方案:
div的水平居中很好解决:设置margin:0 auto ;就行了。要设置div垂直居中怎么做呢?
首先设置该div的祖先宽高都设为100%,然后将该div设为相对定位脱离文档流,设置top值50%,现在div会变成下面这个样子:
所以还需要设置div的margin-top的值为div高度的一半
四、登录实现
Step1:实现控制器
LoginAction是登录控制器,它会调用业务逻辑组件对用户信息验证,验证成功后将用户信息保存到session中。
@Overridepublic String execute() throws Exception {ServiceImpl serviceImpl=new ServiceImpl();//验证通过if (serviceImpl.validate(username, password)){//调用Servlet APIActionContext ctx=ActionContext.getContext();ctx.getSession().put("username", getUsername());ctx.getSession().put("password", getPassword());return SUCCESS;}else return ERROR;}
Step2:配置Action
<!-- 登录Action --><action name="loginAction" class="cn.lzf.action.LoginAction"><result name="error">/WEB-INF/content/err.jsp</result><result>/WEB-INF/content/index.jsp</result></action>
index.jsp是主页面视图,稍后会实现。到此,登录注册功能大致已经实现完了,但是还有不足:没有对用户输入进行校验。
五、为登录注册添加输入校验功能
在LoginAction控制器所在包下创建LoginAction-validation.xml文件,Struts会自动为LoginAction添加输入校验功能。这里为了示范,只对username字段进行了输入校验,登录的校验文件如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "/dtds/xwork-validator-1.0.3.dtd"><validators><field name="username"><field-validator type="requiredstring"><param name="trim">true</param><message>必须输入名字</message></field-validator><field-validator type="regex"><param name="expression"><![CDATA[(\w{4,10})]]></param><message>用户名只能是数字或字母,且长度在4-10之间</message></field-validator></field></validators>
添加了输入校验功能后如果数据没有通过校验页面会转向“input”逻辑视图所对应的资源视图,所以我们还应该为LoginAction、RegisterAction添加一个”input”的结果。
输入格式不正确会转向自身页面,struts标签库提供的表单会自动把message输出来
<!-- 登录Action --><action name="loginAction" class="cn.lzf.action.LoginAction"><result name="error">/WEB-INF/content/err.jsp</result><result>/WEB-INF/content/index.jsp</result><result name="input">/WEB-INF/content/login.jsp</result></action>
同理,也可为RegisterAction添加上输入校验功能。