初窥Struts2(一)

     在介绍struts2之前下回顾一下我们没使用struts2之前是怎么进行网站系统开发的。利用MVC分层思想建立一个项目,我们只实现一个登陆模块功能

     首先我们在mysql中创建按一张表代码如下

1 create table user(
2    id int primary key auto_increment,
3    name varchar(20) not null,
4    password varchar(20) not null
5 );
6 insert into user(name,password) values('tim','123');
7 insert into user(name,password) values('jim','123');
8 insert into user(name,password) values('harry','123');

在MyEclipse建一个工程,工程目录结构如下

一个简单的利用MVC搭建的项目,web.xml配置如下

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 5     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 6     <servlet-mapping>
 7         <servlet-name>ActionServlet</servlet-name>
 8         <url-pattern>*.action</url-pattern>
 9     </servlet-mapping>
10     <welcome-file-list>
11         <welcome-file>index.jsp</welcome-file>
12     </welcome-file-list>
13 </web-app>

使用ActionServlet充当前端控制器,所有请求都通过ActionServlet来控制页面的跳转.

ActionServlet的代码:

 1 package demo.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 import javax.servlet.http.HttpSession;
10 
11 import demo.action.UserAction;
12 import demo.entity.User;
13 
14 public class ActionServlet extends HttpServlet {
15 
16     /**
17      * 
18      */
19     private static final long serialVersionUID = -5458581559476188332L;
20 
21     @Override
22     public void service(HttpServletRequest request, HttpServletResponse response)
23             throws ServletException, IOException {
24         String url = request.getRequestURI();
25         System.out.println(url);
26         String action = url.substring(url.lastIndexOf("/"),
27                 url.lastIndexOf("."));
28         if (action.equals("/login")) {
29             User user = UserAction.login(request, response);
30             if (user != null) {
31                 HttpSession session = request.getSession();
32                 session.setAttribute("user", user);
33                 response.sendRedirect("main.jsp");
34             } else {
35                 request.setAttribute("msg", "用户名或密码错误");
36                 request.getRequestDispatcher(url).forward(request, response);
37             }
38         }
39     }
40 
41 }

上述代码

每一个请求我们都要,进行判断,这样随着业务的增加请求越来越多,service里面的代码越来越多,不便于维护。于是便有了struts2框架,struts2充当了前端控制器的角色,不过struts2控制功能更加强大,代码更加容易维护,使我们只关注与业务代码的编写,而不用关心业务之间的跳转。

现在我们对上述的项目使用struts2进行改进

首先配置web.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 5     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 6     <filter>
 7         <filter-name>struts2</filter-name>
 8         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 9     </filter>
10     <filter-mapping>
11         <filter-name>struts2</filter-name>
12         <url-pattern>/*</url-pattern>
13     </filter-mapping>
14 </web-app>

在src下新建一个struts.xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
 4     "http://struts.apache.org/dtds/struts-2.1.dtd">
 5 <struts>
 6     <!-- 配置package,用于组织和管理Action的配置 
 7                    属性:
 8              name 指定package的名称,可以定义多个包,name不能重复
 9              extends 指定当前包的基包,通常使用包struts-default,
10                                该包由strtus-core-*.jar/struts-default.xml中定义,  包含package所必需的底层配置
11              namespace 指定包的命名空间,用于访问包中的Action时指定对应的路径
12                                例: namespace="/demo",actionName="login"
13                  http://localhost:8080/struts2_analysis/demo/login.action
14                  namespace="/",actionName="login"
15                  http://localhost:8080/struts2_analysis/login.action
16           
17     -->
18     
19     <package name="struts2-analysis" extends="struts-default"
20              namespace="/demo">
21          <!-- 配置login 
22                                  属性name 指定访问Action时使用的名称,访问时以.action结尾
23               method 指定处理业务的方法名称,默认值是execute
24          -->
25          <action name="login"
26                  class="demo.action.UserAction"
27                  method="execute">
28              <!-- 配置Result,用于将视图页面映射为逻辑名称 -->
29              <result name="success">/main.jsp</result>
30              <result name="fail">/login.jsp</result>
31          </action>    
32              
33     </package>
34 </struts>

在对UserAction进行改写

 package demo.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.opensymphony.xwork2.ActionContext;

import demo.dao.UserDao;
import demo.entity.User;

public class UserAction {
public static User login(HttpServletRequest request,
HttpServletResponse response) {
String name = request.getParameter("name");
String password = request.getParameter("password");
UserDao dao = new UserDao();
User user = dao.findUser(name, password);
return user;
}

private String name;
private String password;
private String msg;

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}

public String getName() {
return name;
}

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

public String getPassword() {
return password;
}

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

public String execute() {
UserDao dao = new UserDao();
User user = dao.findUser(name, password);
if (user != null)
return "success";
else {
msg = "用户名或密码错误";
return "fail";
}
}
}

login.jsp代码

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5     <head>
 6         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7         <title>login</title>
 8         <style type="text/css">
 9 .input {
10     width: 200px;
11 }
12 
13 table {
14     margin-left: 35%;
15 }
16 </style>
17     </head>
18     <body>
19         <form action="demo/login.action">
20             <table border="1">
21                 <tr>
22                     <td>
23                         用户名:
24                     </td>
25                     <td>
26                         <input type="text" name="name" class="input" />
27                     </td>
28                 </tr>
29                 <tr>
30                     <td>
31&nbsp;&nbsp;码:
32                     </td>
33                     <td>
34                         <input type="password" name="password" class="input" />
35                     </td>
36                 </tr>
37                 <tr>
38                     <td colspan="2" align="center">
39                         <span style="color: red">${msg}</span>
40                     </td>
41                 </tr>
42                 <tr>
43                     <td colspan="2" align="center">
44                         <input type="submit" value="登录" style=" 100px;" />
45                     </td>
46                 </tr>
47             </table>
48         </form>
49     </body>
50 </html>

在浏览器中输入 http://localhost:8080/struts2_analysis/login.jsp

这样一个利用struts2构建的MVC程序就完成了.有了struts2我们只需要关注与Action的编写就可以了,页面的跳转我们可以再struts.xml中配置。

原文地址:https://www.cnblogs.com/ArtsCrafts/p/2610700.html