Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Переделать веб приложение с сервлетами в RESTful

#java #servlet #rest #веб_служба


Есть приложение, которое соединяется с бд через glassfish ресурсы и все работает.
Используются servlet. Как это можно реализовать с использованием RESTful. Не понимаю
что куда должно передаваться и как. Как REST принимает из формы и возвращает. Все что
я находила было с возвращением статуса, а не  ресурсов. Так же интересно как реализовать
ввод логина и пароля и получать приветствие с именем пользователя, соответствующего
этим логину и паролю в бд. Я совсем плаваю в этом.( 

CRUD операции: 

@Stateless
public class UserLogIn {

@PersistenceContext(unitName = "LEADER")
public EntityManager em;

public UserLogIn(){}



public void add(User user){
    if (!user.getLogin().equals("") || !user.getPassword().equals("") || !user.getUsername().equals("")){
        em.persist(user);
    }
}
public void delete(int id){
    em.remove(getUser(id));
}

public User getUser(int id){
    return em.find(User.class, id);

}
public void update(User user){
    em.merge(user);
}

public List getAll(){
    TypedQuery namedQuery = em.createNamedQuery("User.getAll", User.class);
    return namedQuery.getResultList();
}

}


Сущность: 

@Entity
@Table(name = "annusers")
@NamedQuery(name = "User.getAll", query = "SELECT u FROM User u")
public class User {
@Id
   @SequenceGenerator(name="ad_point_gen",allocationSize=1,sequenceName="ad_points_id_ad_point_seq")
@GeneratedValue(generator="ad_point_gen",strategy=GenerationType.SEQUENCE)
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "login", nullable = false)
private String login;
@Column(name = "password", nullable = false)
private String password;
@Column(name="username", nullable = false)
private String username;

public User() {
}

public User(String login, String password, String username) {
    this.login = login;
    this.password = password;
    this.username = username;
}

public String getLogin() {
    return login;
}

public void setLogin(String login) {
    this.login = login;
}

public String getPassword() {
    return password;
}

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

@Override
public String toString() {
    return "User{" +
            "login='" + login + '\'' +
            ", password='" + password + '\'' +
            ", username='" + username + '\'' +
            '}';
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}
}


Классы сервлетов для работы с CRUD операциями

@WebServlet("/add")
public class AddAndEditUserServlet extends HttpServlet{
   @EJB
   private UserLogIn userLogIn;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException{
    resp.setContentType("text/html");
    req.setCharacterEncoding("UTF-8");

    if(req.getParameter("edit")!=null){
        int id = Integer.valueOf(req.getParameter("edit"));
        User user = userLogIn.getUser(id);
        req.setAttribute("user",user);
    }

    req.getRequestDispatcher("/add.jsp").forward(req,resp);
}

@Override
protected  void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException{
    resp.setContentType("text/html");
    req.setCharacterEncoding("UTF-8");

    String login = req.getParameter("login");
    String password = req.getParameter("password");
    String username = req.getParameter("username");

    if(!req.getParameter("id").equals("")){
        int id = Integer.valueOf(req.getParameter("id"));
        User user = userLogIn.getUser(id);
        user.setLogin(login);
        user.setPassword(password);
        user.setUsername(username);
        userLogIn.update(user);
    }else {
        userLogIn.add(new User(login, password,username));
    }

    resp.sendRedirect("list");
}

}


package com.mkyong.rest.servlet;



@WebServlet("/delete")
public class DeleteUser extends HttpServlet {

@EJB
private UserLogIn userLogIn;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    if(req.getParameter("id") != null && req.getParameter("id") != ""){
        int id = Integer.valueOf(req.getParameter("id"));
        userLogIn.delete(id);
    }
    resp.sendRedirect("list");
}
}





@WebServlet("/list")
public class UserServlet extends HttpServlet{

@EJB
private UserLogIn userLogIn;

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException{
    List allUsers = userLogIn.getAll();
    req.setAttribute("users", allUsers);
    req.getRequestDispatcher("/list.jsp").forward(req,resp);
}

}

    


Ответы

Ответ 1



rest сервисы, как правило нужны для CRUD операций(создание, удаление, редактирование, удаление).например: @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ List allUsers = userLogIn.getAll(); req.setAttribute("users", allUsers); req.getRequestDispatcher("/list.jsp").forward(req,resp); } для запроса /list делает из бд выборку всех пользователей и перенаправляет запрос в list.jsp, где отображается список пользователей. Все что пришло от клиента, находится в объекте класса HttpServletRequest, например: req.getParameter("id") содержит http параметр id Update. Если делать именно рестовский сервис, то надо подключить библиотеку jackson для xml и GSON для json.в методе вместо resp.sendRedirect("list"); возвращаете свой объект, например: @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ List allUsers = userLogIn.getAll(); //.. String json = new Gson().toJson(allUsers); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(json); }

Ответ 2



Вот так будет выглядеть метод rest-сервиса, который выводит приветствие. Импорты из пакета javax.ws.rs @POST @Path("/test-rest-service") @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.TEXT_PLAIN) Response testMethod(String req) { String resp = "Hello " + req; return Response.status(200).entity(resp).encoding("UTF-8").build(); }

Комментариев нет:

Отправить комментарий