用Struts实现用户注册
【1添加jar commons-fileupload/commons-io commons-lang3 javassistfreemarker ognl log4j struts2-core 】
/register/src/struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> 【Action对应的请求后缀 Struts2框架默认后缀为.action或者没有后缀[RESTful]—常量设置 运行时常量设置位于 sturts2-core.jar中/org/apache/struts2/default.properties 可以在struts.xml中使用 】 <constant name="struts.action.extension" value="action" /> 【和调试相关的常量配置】 <constant name="struts.devMode" value="true"/> 【3定义Struts2的核心配置文件】 <package name="default" extends="struts-default" strict-method-invocation="false"> 【4测试—部署当前应用,查看控制器上是否有报错信息】 【5定义表结构】 【11 在配置<action>中允许使用*号通配符,*可以匹配任意长度的任意字符。如果在 name属性中使用*,则在其它配置位置可以使用{1}引用和*匹配的内容】 <action name="*" class="action.UserAction" method="{1}"> <result>/show.jsp</result> <result name="input">/add.jsp</result> </action> 【7定义Action 需要请求转发到 add.jsp 页面---分析需求:不需要在跳转页面之前进行如何处理,所 以定义额外的类没有必要,在struts.xml中添加配置即可。】 <action name="addinput"> <result>/add.jsp</result> </action> <action name="test" class="action.TestAPIAction" method="test"> <result name="show">/show.jsp</result> </action> </package> </struts> |
/register/WebContent/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <filter> <filter-name>struts2</filter-name> 【2、配置前端控制器 web.xml】 <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> 【12和调试相关的常量配置[建议在开发阶段打开,产品部署关闭] struts.devMode=true 依赖于 debugging 拦截器实现打开调试模式,提供了一个比较友好的报错页面并且相当于配置 2个常量: struts.i18n.reload = true自动发现并加载修改的properties文件—国际化处理 struts.configuration. xml.reload = true 自动发现并加载修改的 struts.xml 之类的配置文件即修改资源文件和配置文件无需重启服务器。配置方法在web.xml中配置前端控制器时直接设置】 <init-param> <param-name>struts.devMode</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> |
【6定义欢迎首页 index.jsp】
/register/WebContent/index.jsp
<%@page import="java.util.Random"%> <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Insert title here</title> </head> <body > <a href="addinput.action">注册新用户</a> </body> </html> |
【8定义add.jsp页面收集客户动作,显示一个<form>
Struts2 为了简化页面编写提供了一套标签库,可以分为 2 大类:UI 标签(有显示的,例如生成输入域的<s:textfield/>)和非 UI标签(显示逻辑<s:if>)
UI 标签的基本使用:Struts2针对 UI 标签显示效果提供了 4 种主题:xhtml(默 认) css_xhtml simple ajax 】
/register/WebContent/add.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Insert title here</title> <s:head/> </head> <body> <s:form action="add.action"> <s:textfield name="username" label="用户名称" requiredLabel="true" requiredPosition="left" /> <s:password name="password" label="用户口令"/> <s:textfield name="birth" label="出生日期"/> <s:radio list="#{true:'男',false:'女'}" name="sex" label="性别" value="true"/> <tr> <td colspan="2"> <s:submit value="新增用户" theme="simple"/> <s:reset value="重置数据" theme="simple"/> </td> </tr> </s:form> </body> </html> |
【9 定义JavaBean类 定义Action接受用户提交数据】
/register/src/entity/UserBean.java
package entity; import java.io.Serializable; import java.util.Date; public class UserBean implements Serializable { private static final long serialVersionUID = -5034919634609908387L; private Long id; private String username; private String password; private Date birth; private Boolean sex; public Long getId() { return id; } public void setId(Long id) { this.id = id; } 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; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Boolean getSex() { return sex; } public void setSex(Boolean sex) { this.sex = sex; } @Override public String toString() { return "UserBean [id=" + id + ", username=" + username + ", password=" + password + ", birth=" + birth + ", sex=" + sex + "]"; } } |
/register/src/test/AddAction.java
package test; import org.apache.commons.lang3.StringUtils; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import dao.IUserDao; import entity.UserBean; import util.DaoFactory; public class AddAction extends ActionSupport implements ModelDriven<UserBean> {// 接收数据采用模型驱动 private static final long serialVersionUID = 247660036984230534L; private UserBean user = new UserBean(); private IUserDao userDao = DaoFactory.getUserDao(); @Override public String execute() throws Exception {// 接收数据后调用执行业务逻辑 userDao.save(user); return SUCCESS; } @Override public void validate() {// 在execute方法之前进行服务器端数据校验 if (StringUtils.isBlank(user.getUsername())) this.addFieldError("username", "用户名称不能为空!"); if (StringUtils.isBlank(user.getPassword())) this.addFieldError("password", "用户口令不能为空!"); } @Override public UserBean getModel() {// ModelDriven接口必须实现的方法,要求不能返回null return user; } } |
【10 Action 类中方法的定义问题: 根据面向对象的规则,需要将一组相关的操作定义在一个 Action类中 在MVC部分实现的方法】
/register/src/test/BaseServlet.java
package test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BaseServlet extends HttpServlet { private static final long serialVersionUID = -463846114866749822L; protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { this.doPost(req, res); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 额外添加一个请求参数method,其中当method=del时表示执行删除操作,method=add时表示执行添加操作 String method = request.getParameter("method"); if ("del".equalsIgnoreCase(method)) del(request, response); else if ("add".equalsIgnoreCase(method)) add(request, response); } public void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } public void del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } } |
【13 在Action类中按照校验方法的命名规则定义对应的校验方法】
/register/src/action/UserAction.java
package action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import entity.UserBean; public class UserAction extends ActionSupport implements ModelDriven<UserBean> { private static final long serialVersionUID = 8031461554596385788L; private UserBean user = new UserBean(); @Override public String execute() throws Exception { System.out.println("UserAction.execute()"); return super.execute(); } public String add() throws Exception { System.out.println("UserAction.add()"); return super.execute(); } public String del() throws Exception { System.out.println("UserAction.del()"); return super.execute(); } @Override public UserBean getModel() { return user; } public UserBean getUser() { return user; } public void setUser(UserBean user) { this.user = user; } } |
【14 定义接口】
/register/src/dao/IUserDao.java
package dao; import entity.UserBean; public interface IUserDao { public void save(UserBean user); } |
【15定义实现类】
/register/src/dao/UserDaoImpl.java
package dao; import entity.UserBean; public class UserDaoImpl implements IUserDao { @Override public void save(UserBean user) { System.out.println(user); } } |
【16 定义工厂类】
/register/src/util/DaoFactory.java
package util; import dao.IUserDao; import dao.UserDaoImpl; public class DaoFactory { public static IUserDao getUserDao() { return new UserDaoImpl(); } } |
【Action 中访问ServletAPI】
/register/src/action/TestAPIAction.java
package action; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class TestAPIAction extends ActionSupport implements ServletRequestAware { private static final long serialVersionUID = 309095482763293411L; private HttpServletRequest request; public String test() throws Exception { // 在session中存放数据 request.getSession().setAttribute("now", "在session中存放的数据"); return "show"; } @Override public void setServletRequest(HttpServletRequest arg0) { this.request = arg0; } } |
/register/WebContent/show.jsp
<%@page import="java.util.Random"%> <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Insert title here</title> </head> <body> ${sessionScope.now} </body> </html> |