• Struts2


    Struts2提供了一个restful的插件:struts2-rest-plugin-2.3.16.1.jar

    这个插件可以把Struts2当做restful来使用,不过它的rest功能目前来说有点“死板”,定死了格式,这是使用这个插件不是那么爽的地方,或许有别的方式可以修改,之后再研究。

    这是它的rest格式:

    RestActionMapper 对 HTTP 请求的处理

    HTTP 方法 URI 调用 Action 的方法 请求参数
    GET /user index  
    POST /user create  
    PUT /user/2 update id=2
    DELETE /user/2 destroy id=2
    GET /user/2 show id=2
    GET /user/2/edit edit id=2
    GET /user/new editNew  


    直接上自己学习写的例子:
    在eclipse中怎么加插件就不写了,引包就可以了,记得要把Convertion的包也引入。

    1)web.xml的配置:

        <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>

    2)新增一个Entity:

    package com.my.beans;
    
    import java.util.Date;
    
    public class User {
        
        private int Id;
        private String username;
        private String password;
        private int age;
        private Date createTime;
        
        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 int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public Date getCreateTime() {
            return createTime;
        }
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
        public int getId() {
            return Id;
        }
        public void setId(int id) {
            Id = id;
        }
        
        public User(int id, String username, String password, int age,
                Date createTime) {
            Id = id;
            this.username = username;
            this.password = password;
            this.age = age;
            this.createTime = createTime;
        }
        
        public User() {
        }
        
    }

    3) 建一个Service类,用于模拟持久层的读写用:

    package com.my.service;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import com.my.beans.User;
    
    public class UserService {
    
        // new一个用户列表数据对象,模拟持久层数据
        private static Map<Integer, User> users = new HashMap<Integer, User>();
    
        // 初始化用户列表数据,模拟持久层数据
        static {
            users.put(1, new User(1, "robin1", "password1", 18, new Date()));
            users.put(2, new User(2, "robin2", "password2", 19, new Date()));
            users.put(3, new User(3, "robin3", "password3", 20, new Date()));
            users.put(4, new User(4, "robin4", "password4", 21, new Date()));
            users.put(5, new User(5, "robin5", "password5", 22, new Date()));
        }
    
        /**
         * 通过用户ID取得用户实体
         * @param id
         * @return
         */
        public User getId(int id) {
            return users.get(id);
        }
    
        /**
         * 取得所有用户列表
         * @return
         */
        public List<User> getAll() {
            return new ArrayList<User>(users.values());
        }
    
        /**
         * 更新用户
         * @param user
         */
        public void update(User user) {
            if (user.getId() > 0) {
                users.put(user.getId(), user);
            }
        }
    
        /**
         * 新增用户
         * @param user
         */
        public void add(User user) {
            int size = users.size();
            int id = size + 1;
            user.setId(id);
            users.put(id, user);
        }
    
        /**
         * 删除用户
         * @param id
         */
        public void remove(int id) {
            users.remove(id);
        }
    
    }

    4) 新建一个struts.xml在src目录下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
        <!-- 把它设置为开发模式,发布时要设置为false -->
        <constant name="struts.devMode" value="true" />
        <!-- 设置在class被修改时是否热加载,发布时要设置为false -->
        <constant name="struts.convention.classes.reload" value="true"/>
        <!-- 自动动态方法的调用,使用这个设置后可以这样调用:action!method -->
        <constant name="struts.enable.DynamicMethodInvocation" value="true" />
        <!-- 指定jsp文件所在的目录地址 -->
        <constant name="struts.convention.result.path" value="/WEB-INF/content/" />
        <!-- 使用struts-default默认的转换器,如果是rest的使用:rest-default,rest需要rest的jar插件 -->
        <constant name="struts.convention.default.parent.package" value="rest-default"/>
        <!-- 用于配置包名后缀。默认为action、actions、struts-->
        <constant name="struts.convention.package.locators" value="controller" />
        <!-- 用于配置类名后缀,默认为Action,设置后,Struts2只会去找这种后缀名的类做映射 -->
        <constant name="struts.convention.action.suffix" value="Controller"/>
        <!-- 设置即使没有@Action注释,依然创建Action映射。默认值是false。因为Convention-Plugin是约定优于配置的风格,
            可以不通过注解根据预先的定义就能访问相应Action中的方法 -->
        <constant name="struts.convention.action.mapAllMatches" value="true"/>
        <!-- 自定义jsp文件命名的分隔符 -->
        <constant name="struts.convention.action.name.separator" value="-" />
        <!-- 国际化资源文件名称 -->
        <constant name="struts.custom.i18n.resources" value="i18n" />
        <!-- 是否自动加载国际化资源文件  -->
        <constant name="struts.i18n.reload" value="true" />
        <!-- 浏览器是否缓存静态内容 -->
        <constant name="struts.serve.static.browserCache" value="false" />
         <!-- 上传文件大小限制设置 -->
        <constant name="struts.multipart.maxSize" value="-1" />
        <!-- 主题,将值设置为simple,即不使用UI模板。这将不会生成额外的html标签 -->
        <constant name="struts.ui.theme" value="simple" />
        <!-- 编码格式 -->
        <constant name="struts.i18n.encoding" value="UTF-8" />
    
    </struts>

    5) 新建设一个Controller的类:

    package com.my.controller;
    
    import java.util.List;
    
    import org.apache.struts2.convention.annotation.Result;
    import org.apache.struts2.convention.annotation.Results;
    import org.apache.struts2.rest.DefaultHttpHeaders;
    import org.apache.struts2.rest.HttpHeaders;
    
    import com.my.beans.User;
    import com.my.service.UserService;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    @SuppressWarnings("serial")
    @Results(@Result(name = "success", type = "redirect", location="/user"))
    public class UserController extends ActionSupport implements
            ModelDriven<Object> {
    
        // Rest URL请求的ID值
        private int id;
        // 用户实体
        private User model = new User();
        // 用户列表
        private List<User> list;
        // 用户Service
        private UserService userService = new UserService();
    
        /**
         * 使用ModelDriven,重写getModel()方法
         */
        @Override
        public Object getModel() {
            return (list != null ? list : model);
        }
    
        /**
         * 设置用户ID
         * @param id
         */
        public void setId(int id) {
            this.id = id;
            // 如果用户ID大于零,取得用户实体
            if (id > 0) {
                this.model = userService.getId(id);
            }
        }
    
        /**
         * 取得用户ID
         * @return
         */
        public int getId() {
            return this.id;
        }
    
        /**
         * 功能:首页
         * 调用:GET /user
         * 返回:user-index.jsp
         * @return
         */
        public HttpHeaders index() {
            list = userService.getAll();
            return new DefaultHttpHeaders("index").disableCaching();
        }
    
        /**
         * 功能:新增一个用户
         * 调用:GET /user/new
         * 返回:user-editNew.jsp
         * @return
         */
        public String editNew() {
            model = new User();
            return "editNew";
        }
    
        /**
         * 功能:保存新增用户
         * 调用:POST /user
         * 返回:user-index.jsp
         * @return
         */
        public HttpHeaders create() {
            userService.add(this.model);
            return new DefaultHttpHeaders(SUCCESS)
                    .setLocationId(this.model.getId());
        }
    
        /**
         * 功能:显示用户信息明细,返回show的jsp
         * 调用:GET /user/1
         * 返回:user-show.jsp
         * @return
         */
        public HttpHeaders show() {
            return new DefaultHttpHeaders("show");
        }
    
        /**
         * 功能:编辑用户
         * 调用:GET /user/1/edit
         * 返回:user-edit.jsp
         * @return
         */
        public String edit() {
            return "edit";
        }
    
        /**
         * 功能:更新用户信息
         * 调用:PUT /user/1
         * 返回:user-index.jsp
         * @return
         */
        public String update() {
            userService.update(this.model);
            addActionMessage("Update user successed.");
            return SUCCESS;
        }
    
        /**
         * 功能:删除用户
         * 调用:DELETE /user/1
         * 返回:user-index.jsp
         * @return
         */
        public String destroy() {
            userService.remove(id);
            addActionMessage("Delete user successed.");
            return SUCCESS;
        }
    
    }

    注意这一句:@Results(@Result(name = "success", type = "redirect", location="/user"))
    这句注解的意思是如果在方法中返回的是SUCCESS,则会将页面重定向到这个地址:/user
    不知道为什么,如果把type="redirect"改为type="redirectAction",它总会在地址后面加一个statusCode=303,然后会报一个错误。
    AddActionMessage(...)方法调用后,在jsp中可以使用<s:actionmessage/>输出内容。

    (继:Struts2 - Rest(2))

  • 相关阅读:
    DAO模式多表联查
    使用ADO.NET访问数据库
    连接查询和分组查询
    模糊查询和聚合函数
    poj 1220 NUMBER BASE CONVERSION
    poj 1964 City Game
    Odd number problem
    POJ 2983 M × N Puzzle
    L O V E
    【Mybatis】【3】处理大于号小于号及其他特殊字符
  • 原文地址:https://www.cnblogs.com/HD/p/3656482.html
Copyright © 2020-2023  润新知