Last updated Jun 21, 2024

Store and retrieve plugin data

Your plugin now has a sophisticated look and feel. In this last section of the tutorial you'll make your plugin fully functional. You'll add a POST method to the admin.vm template so you can enter and retrieve user data.

About plugin data storage

When you added component import modules to your plugin, you added PluginSettingsFactory. This import allows you to use PluginSettings, a SAL service that manages your plugin data storage. The POST method you add to your admin.vm template will submit the form to the database, and PluginSettings permits you to retrieve stored submissions from the database.

Step 1. Add a POST method to your admin.vm template

This is one of the most common HTTP requests. In this step, you'll add a line of code to your admin.vm file.

  1. Open your admin.vm file from src/main/resources.

  2. Add a POST method in the <form> tag.

        <title>MyServlet Admin</title>
        <meta name="decorator" content="atl.admin">
        <form id="admin" class="aui" action="" method="POST">
            <div class="field-group">
                 <label for="name">Name:</label>
                 <input type="text" id="name" name="name" class="text">
            <div class="field-group">
                 <label for="age">Age:</label>
                 <input type="text" id="age" name="age" class="text">
            <div class="field-group">
                <input type="submit" value="Save" class="button">
  3. Save and close the file.

Step 2. Update project files in Eclipse

In this step you'll update the dependencies in your pom.xml and MyPluginServlet so you can store and retrieve data. 

  1. Open

  2. Replace the contents of the class with the following.

    package com.atlassian.plugins.tutorial.refapp;
    import java.util.HashMap;
    import java.util.Map;
    import javax.servlet.*;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
    import com.atlassian.plugin.spring.scanner.annotation.component.Scanned;
    import javax.inject.Inject;
    import com.atlassian.sal.api.auth.LoginUriProvider;
    import com.atlassian.sal.api.user.UserManager;
    import com.atlassian.templaterenderer.TemplateRenderer;
    import com.atlassian.sal.api.pluginsettings.PluginSettings;
    import com.atlassian.sal.api.pluginsettings.PluginSettingsFactory;
    public class MyPluginServlet extends HttpServlet
        private static final String PLUGIN_STORAGE_KEY = "com.atlassian.plugins.tutorial.refapp.adminui";
        private final UserManager userManager;
        private final LoginUriProvider loginUriProvider;
        private final TemplateRenderer templateRenderer;
        private final PluginSettingsFactory pluginSettingsFactory;
        public MyPluginServlet(UserManager userManager, LoginUriProvider loginUriProvider, TemplateRenderer templateRenderer, PluginSettingsFactory pluginSettingsFactory) {
            this.userManager = userManager;
            this.loginUriProvider = loginUriProvider;
            this.templateRenderer = templateRenderer;
            this.pluginSettingsFactory = pluginSettingsFactory;
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
            String username = userManager.getRemoteUsername(request);
            if (username == null || !userManager.isSystemAdmin(username))
                redirectToLogin(request, response);
            Map<String, Object> context = new HashMap<String, Object>();
            PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();
            if (pluginSettings.get(PLUGIN_STORAGE_KEY + ".name") == null){
                String noName = "Enter a name here.";
                pluginSettings.put(PLUGIN_STORAGE_KEY +".name", noName);
            if (pluginSettings.get(PLUGIN_STORAGE_KEY + ".age") == null){
                String noAge = "Enter an age here.";
                pluginSettings.put(PLUGIN_STORAGE_KEY + ".age", noAge);
            context.put("name", pluginSettings.get(PLUGIN_STORAGE_KEY + ".name"));
            context.put("age", pluginSettings.get(PLUGIN_STORAGE_KEY + ".age"));
            templateRenderer.render("admin.vm", response.getWriter());
        protected void doPost(HttpServletRequest req, HttpServletResponse response)
                throws ServletException, IOException {
            PluginSettings pluginSettings = pluginSettingsFactory.createGlobalSettings();
            pluginSettings.put(PLUGIN_STORAGE_KEY + ".name", req.getParameter("name"));
            pluginSettings.put(PLUGIN_STORAGE_KEY + ".age", req.getParameter("age"));
        private void redirectToLogin(HttpServletRequest request, HttpServletResponse response) throws IOException
        private URI getUri(HttpServletRequest request)
            StringBuffer builder = request.getRequestURL();
            if (request.getQueryString() != null)
            return URI.create(builder.toString());
        // This is what your should look like in its final stages.
  3. Save and close MyPluginServlet.

Step 3. Enter and retrieve data 

The final step is to verify that your plugin can store and retrieve data. Here you'll make an entry and confirm that you can look it up using the PLUGIN_STORAGE_KEY. You'll perform your lookups in the Plugin Data Console.

  1. Reload your plugin and return to localhost:2990/jira/plugins/servlet/test.

  2. Make an entry such as Charlie/34 for Name/Age and click Save.

  3. Navigate to the Plugin Data Editor. You can navigate directly to the editor at localhost:2990/jira/plugins/servlet/pde
    Alternatively you can click Question Mark > Developer Toolbox > Plugin Data Console.

  4. Under Plugin Settings Query, choose Global.

  5. For the Data Key, enter to query the names entered, or com.atlassian.plugins.tutorial.refapp.adminui.age to query the ages entered.
    This is the PLUGIN_STORAGE_KEY value that you coded into your MyPluginServlet class.

  6. Click Lookup.

    You'll see your entries displayed in the Results section.

Next steps

You've created a plugin complete with a GUI that accepts and stores data - no minor feat. You might consider learning more about developer toolscreating plugin tests, or perusing the FAQ:  

Developing plugins for Confluence

Developing for the Marketplace

Rate this page: