web项目jsp+servlet重构成为Struts2项目的步骤

版权声明:未经允许请勿转载 https://blog.csdn.net/qq_43287658/article/details/90143992

一、项目背景

上个学期学习web,做了一个web项目,因为当时老师上课讲的是jsp+servlet的代码,所以就用jsp+servlet的MVC架构做了。现在老师布置作业要做j2ee的项目,我就想着,可以把上学期的servlet代码修改一下,改成SSM架构,直接当做j2ee的作业提交,岂不是美滋滋~~

二、项目前提(要有servlet的代码)

上个学期做的是一个模拟银行的系统,里面有登录和注册的功能,我们首先要做的是将servlet的代码重构成为Struts2代码。

1、登录表单jsp代码

<form class="form-horizontal" action="denglu.do" method="post">
    <fieldset>
        <div class="control-group section-top-10">
            选择你的身份:
            <div class="controls">
                <select id="shenfenxinxi" name="shenfen" size="1">
                    <option value="users"> 用户 </option>
                    <option value="amd"> 管理员 </option>
                </select>
            </div>
        </div>
        <div class="control-group section-top-10">
            账号 :
            <div class="controls">
                <input id="userid" name="userid" type="text" class="form-control input-medium" placeholder="请输入账号/手机号/邮箱" required>
            </div>
        </div>
        <div class="control-group section-top-10">
            密码 :
            <div class="controls">
                <input type="password" name="passwordinput" class="form-control input-medium" placeholder="请输入密码" required>
            </div>
        </div>
        <div class="checkbox">
            <label><input type="checkbox" class="blue">记住密码</label>
        </div>
        <input id="paturl" type="hidden" name="url" value="">
        <div id="ErrorMessageDiv" style="color:red"></div>
        <div class="control-group">
            <div class="controls section-top-10">
                <button id="signin_btn" name="signin" type="submit" class="btn btn-success form-control"> 登录  </button>
            </div>
        </div>
    </fieldset>
</form>

2、注册表单jsp代码

<form class="form-horizontal" action="zhuce.do" method="post">
    <fieldset>
        <div class="control-group section-top-10">姓名:
            <div class="controls">
                <input id="user" name="name" class="form-control input-large" type="text" placeholder="请输入真实姓名" required="">
            </div>
        </div>
        <div class="control-group section-top-10">邮箱 :
            <div class="controls">
                <input id="Email_id" name="Email" class="form-control input-large" type="email" placeholder="格式:[email protected]" required>
            </div>
        </div>
        <div class="control-group section-top-10">手机号 :
            <div class="controls">
                <input id="shoujihao" name="shoujihao" class="form-control input-large" type="text" placeholder="请输入手机号" required="">
            </div>
        </div>
        <div class="control-group section-top-10">密码 :
            <div class="controls">
                <input id="password" name="password" class="form-control input-large" type="password" placeholder="请输入密码" required>
            </div>
        </div>
        <div class="control-group section-top-10">确认密码 :
            <div class="controls">
                <input id="reenterpassword" class="form-control input-large" name="reenterpassword" type="password" placeholder="再次输入上方密码" required="">
            </div>
        </div>
        <div class="control-group section-top-10">
            <div class="controls">
                <button id="confirmsignup" name="confirmsignup" type="submit" class="btn btn-success form-control">提交注册</button>
            </div>
        </div>
    </fieldset>
</form>

3、登录的servlet代码

public class DengLu extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws IOException {
		response.setContentType("text/html");//设置参数传递编码方式
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");

		HttpSession session = request.getSession(false);//获取session
		String name = request.getParameter("userid"); //获取账号密码身份信息
		String pass = request.getParameter("passwordinput");
		String shenfen = request.getParameter("shenfen");
		String url = request.getParameter("url");

		//实例化判断账号密码的对象
		PanDuanZhangHao panduan = new PanDuanZhangHao(name, pass, shenfen);
		String flag = panduan.panDuan(); //判断账号密码是否正确
		if(flag.equals("false")){
			response.sendRedirect(url); //返回之前的页面。
		}else{
			Users users = panduan.getUsersByNameOrShoujihaoOrYouxiang(flag,name,pass);//根据对应的输入的信息获取用户的详细信息
			session.setAttribute("users", users); //把user存在session里面
			response.sendRedirect(url); //返回之前的页面。
		}
	}
}

4、注册的servlet代码

public class ZhuCe extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		request.setCharacterEncoding("UTF-8");
    	response.setCharacterEncoding("UTF-8");
    	
		PrintWriter out = response.getWriter();
    	HttpSession session = request.getSession();
    	Random rand = new Random();
    	int zh = rand.nextInt(90000) + 10001;
    	String zhanghao = zh + "";//系统随机生成银行卡号
		String name = request.getParameter("name");
		String email = request.getParameter("Email");
		String shoujihao = request.getParameter("shoujihao");
		String pass1 = request.getParameter("password");
		String pass2 = request.getParameter("reenterpassword");
		Users user = new Users();
		pass1 = pass1 + "1";//简单的密码加密
		String sql = "insert into users values('" + zhanghao + "','" 
			+ pass1 + "','" + yue + "" + "','" + name + "','" 
			+ email + "','" + shoujihao + "','" + money + "')";
		DAO dao = new DAO();
		dao.zengjia(sql);
		user.setZhanghao(zhanghao);
		user.setMima(pass1);
		user.setYue(yue);
		user.setXingming(name);
		user.setYouxiang(email);
		user.setShoujihao(shoujihao);
		user.setMoney(money);
		session.setAttribute("users", user);//user刚注册的信息存入session
		response.sendRedirect("Register.jsp");
		out.flush();
		out.close();
	}
}

5、web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
	<servlet>
	    <servlet-name>DengLu</servlet-name>
	    <servlet-class>com.servlet.DengLu</servlet-class>
	</servlet>
	<servlet-mapping>
	    <servlet-name>DengLu</servlet-name>
	    <url-pattern>/denglu.do</url-pattern>
	  </servlet-mapping>
	<servlet>
	    <servlet-name>ZhuCe</servlet-name>
	    <servlet-class>com.servlet.ZhuCe</servlet-class>
	</servlet>
	    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

以上就是修改之前有关登录注册的核心代码,实体类的代码就不放上来了,只是简单的get,set方法。

三、开始修改代码

1、项目导入Struts2的包

这是Struts2的包
这是Struts2用到的包,可以自己的百度下载,也可以用我上传的包。(审核中,通过了以后我把链接放过来)
我这里使用的是Struts2.3的包,虽然现在最新的已经出来2.5.16了,不过我配置了半天还是有问题,无奈只能用老版本了。

2、修改web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.FilterDispatcher
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <display-name></display-name>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

因为要修改之前的servlet变成struts,所以之前有关servlet的配置就可以删除掉了。
(小提示:为了以防万一,比如发生了代码修改失败等等情况,建议新建一个文件夹里面放struts类的文件,路径配置一下就好了。)

3、创建文件struts.xml

在项目的src目录下创建struts.xml文件,并添加以下代码

<!DOCTYPE struts PUBLIC
		"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
		"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="struts" extends="struts-default">
		<!-- 下方添加action -->
		<action name="login" class="com.Struts.LoginAction"><!-- 登录 -->
			<result name="success">index.jsp</result>
			<result name="error">index.jsp</result>
		</action>

		<action name="register" class="com.Struts.RegisterAction"><!-- 注册 -->
			<result name="success">Register.jsp</result>
		</action>
	</package>
</struts>

package中的action标签是可以添加或删除的,每个action的name属性对应jsp表单中的action的值,不过表单中要添加.action后缀,具体看以下例子

4、修改登录注册表单中的action值

(完整的表单代码在上面)

4.1 登录jsp页面中的表单

修改前:

扫描二维码关注公众号,回复: 6214443 查看本文章
<form class="form-horizontal" action="denglu.do" method="post">

修改后:

<form class="form-horizontal" action="login.action" method="post">

4.2 注册jsp页面中的表单

修改前:

<form class="form-horizontal" action="zhuce.do" method="post">

修改后:

<form class="form-horizontal" action="register.action" method="post">

注意表单中的action值和struts配置文件action中的name对应
action对应

5、修改servlet变成Struts

5.1 登录部分的Struts代码

public class LoginAction extends ActionSupport implements ModelDriven<LoginUser>{

    private LoginUser loginUser = new LoginUser();
    @Override
    public LoginUser getModel() {
        return loginUser;
    }

    public String execute() throws IOException {
        String loginResult;//Struts2拦截器还没实现,先这样写,以后再改
        ActionContext actionContext = ActionContext.getContext(); //获取上下文
        HttpServletRequest request =(HttpServletRequest)actionContext.get(ServletActionContext.HTTP_REQUEST);//获取request对象
        HttpServletResponse response = (HttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE);//获取response对象
        HttpSession session = request.getSession(false);//获取session
        String name = loginUser.getUserid();
        String pass = loginUser.getPasswordinput();
        String shenfen = loginUser.getShenfen();
        String url = loginUser.getUrl();

        //实例化判断账号密码的对象
        PanDuanZhangHao panduan = new PanDuanZhangHao(name, pass, shenfen);
        String flag = panduan.panDuan(); //判断账号密码是否正确
        if(flag.equals("false")){
            loginResult = Action.ERROR;
            response.sendRedirect(url); //返回之前的页面。//因为拦截器还不行,所以就先用这个跳转
        }else{
            Users users = panduan.getUsersByNameOrShoujihaoOrYouxiang(flag,name,pass);//根据对应的输入的信息获取用户的详细信息
            session.setAttribute("users", users); //把user存在session里面
            loginResult = Action.SUCCESS;
            response.sendRedirect(url); //返回之前的页面。
        }
        return loginResult;
    }
}

要注意把登录struts类的路径配置在struts.xml的action标签中的class里面,注册的struts类同理,下面就不再赘述。

5.2 注册部分的Struts代码

public class RegisterAction extends ActionSupport implements ModelDriven<RegisterUser> {

    private RegisterUser registerUser = new RegisterUser();
    @Override
    public RegisterUser getModel() {
        return registerUser;
    }

    public String execute(){
        String registerResult;
        HttpSession session = ServletActionContext.getRequest().getSession();
        Random rand = new Random();
        int zh = rand.nextInt(90000) + 10001;
        String zhanghao = zh + "";//系统随机生成银行卡号
        String name = registerUser.getName();
        String email = registerUser.getEmail();
        String shoujihao = registerUser.getShoujihao();
        String pass1 = registerUser.getPassword();
        Users user = new Users();
        pass1 = pass1 + "1";//简单的密码加密
        String sql = "insert into users values('" + zhanghao + "','"
                + pass1 + "','" + yue + "" + "','" + name + "','"
                + email + "','" + shoujihao + "','" + money + "')";
        DAO dao = new DAO();
        dao.zengjia(sql);
        user.setZhanghao(zhanghao);
        user.setMima(pass1);
        user.setYue(yue);
        user.setXingming(name);
        user.setYouxiang(email);
        user.setShoujihao(shoujihao);
        user.setMoney(money);
        session.setAttribute("users", user);//user刚注册的信息存入session

        registerResult = Action.SUCCESS;
        return registerResult;
    }
}

6、创建登录注册表单对应的实体类

6.1 创建登录表单对应实体类

public class LoginUser {
    private String userid;
    private String passwordinput;
    private String shenfen;
    private String url;

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getPasswordinput() {
        return passwordinput;
    }

    public void setPasswordinput(String passwordinput) {
        this.passwordinput = passwordinput;
    }

    public String getShenfen() {
        return shenfen;
    }

    public void setShenfen(String shenfen) {
        this.shenfen = shenfen;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

唯一要注意的地方就是实体类中的成员变量名称和表单的input中的name值要完全相同。注册类也是一样,就不赘述了。
实体类中的成员变量名称和表单的input中的name值要完全相同

6.2 创建注册表单对应实体类

public class RegisterUser {
    private String name;
    private String Email;
    private String shoujihao;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return Email;
    }

    public void setEmail(String email) {
        Email = email;
    }

    public String getShoujihao() {
        return shoujihao;
    }

    public void setShoujihao(String shoujihao) {
        this.shoujihao = shoujihao;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

创建完成后,对应的struts类要实现一个ModelDriven<实体类名>的接口。具体代码在struts类中已经有了。

四、原理解释

1、struts2原理图

struts2原理图

2、struts2的工作流程

2.1 比较官方的解释

  1. 客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
  2. 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
  3. 接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action;
  4. 如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy;
  5. ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;
  6. ActionProxy创建一个ActionInvocation的实例。
  7. ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
  8. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
  9. 返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

2.2 结合我们自己的项目,通俗的解释

  1. jsp页面的表单填写完整后,点击登录或者注册按钮,向Servlet容器(例如Tomcat)发出请求。
  2. 这个请求经过一系列的过滤器,到达了刚才配置好的LoginAction或者RegisterAction,执行相应的逻辑。
  3. 逻辑执行完成后,返回值传到struts.xml中相对应的action中,打开对应的jsp页面。

五、运行验收成果

如果能成功打开之前web项目的主页,并且能正常使用登录注册的功能,那么恭喜你,struts项目重构成功。如果出现类似404的错误,也不要气馁,毕竟本人第一次配置也是一堆bug,花了好长时间才弄好,最主要的还是耐心,出现问题多去百度找找答案,也可以在下方评论留言或者私聊我,我看到了就会帮助大家解决问题。

最后祝大家学习进步,生活愉快!

猜你喜欢

转载自blog.csdn.net/qq_43287658/article/details/90143992