Может ли servlet обрабатывать несколько страниц?

Вопрос такой: нужно ли создавать для каждой страницы сайта свой servlet или один servlet может обрабатывать несколько страниц? Например: есть страницы /contact и /about, нужно ли мне создавать ServletContact и ServletAbout или нужно использовать другой подход? Спасибо.
  • Вопрос задан
  • 2331 просмотр
Решения вопроса 1
EugeneP2
@EugeneP2
Java Dev
Используйте паттерн Model-View-Controller.

Например, у вас есть приложение Контакты.

Сервлет будет контроллером обрабатывающий различные манипуляции с контактами.
Для отображения результатов, форм, списков - используйте jsp

Вот простенький пример контроллера (сервлета), который обрабатывает CRUD операции с контактами
@WebServlet(urlPatterns = "/contact")
public class ContactController extends HttpServlet {

	private ContactDao contactDao = new HashMapContactDao();
	
	@Override
	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		contactDao.removeById(Long.valueOf(req.getParameter("id")));
		this.doGet(req, resp);
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		List<Contact> contactList = contactDao.findAll();
		req.setAttribute("contactList", contactList);
		req.getRequestDispatcher("view/contact.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		Contact newContact = new Contact();
		newContact.setLastName(req.getParameter("lastName"));
		newContact.setFirstName(req.getParameter("firstName"));
		newContact.setPhone(req.getParameter("phone"));
		
		this.contactDao.add(newContact);

		this.doGet(req, resp);
	}

	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		Contact newContact = new Contact();
		newContact.setId(Long.valueOf(req.getParameter("id")));
		newContact.setLastName(req.getParameter("lastName"));
		newContact.setFirstName(req.getParameter("firstName"));
		newContact.setPhone(req.getParameter("phone"));

		this.contactDao.update(newContact);
		
		super.doPut(req, resp);
	}
}


Отображение (view) контактов view/contact.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Список контактов</title>
<style type="text/css">
table {
	border-collapse: collapse;
}

table, td, th {
	border: 1px solid black;
}
</style>
</head>
<body>

	<h1>Список контактов</h1>

	<form method="post">
		<fieldset>
			<legend>Новый контакт</legend>
			<p>
				<label>Фамилия: <input type="text" name="lastName" /></label>
			</p>
			<p>
				<label>Имя: <input type="text" name="firstName" /></label>
			</p>
			<p>
				<label>Номер телефона: <input type="text" name="phone" /></label>
			</p>
			<p>
				<button>Создать</button>
			</p>
		</fieldset>
	</form>

	<table style="border: 1px solid black;">
		<tr>
			<th>№</th>
			<th>Фамилия</th>
			<th>Имя</th>
			<th>Номер телефона</th>
		</tr>


		<c:if test="${contactList != null}">
			<c:forEach items="${contactList}" var="c">

				<tr>
					<td>${c.id}</td>
					<td>${c.lastName}</td>
					<td>${c.firstName}</td>
					<td>${c.phone}</td>
				</tr>

			</c:forEach>
		</c:if>
	</table>

</body>
</html>


Модель
public class Contact {

	private Long id;
	private String lastName;
	private String firstName;
	private String phone;

	public Contact() {
	}

	public Contact(String lastName, String firstName, String phone) {
		this.lastName = lastName;
		this.firstName = firstName;
		this.phone = phone;
	}

	public Long getId() {
		return id;
	}

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

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}


	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
	}
}


А доступ к данным и их манипуляциями мы отделяем слоем DAO (простенькая реализация на основе HashMap). Благодаря интерфейсу, в будущем мы сможем подставить любую реализацию, например хранение контактов в базе данных.

public class HashMapContactDao implements ContactDao {

	private AtomicLong idCounter = new AtomicLong();
	private Map<Long, Contact> map = new ConcurrentHashMap<Long, Contact>();
	
	@Override
	public List<Contact> findAll() {
		return new ArrayList<Contact>(this.map.values());
	}

	@Override
	public void removeById(Long id) {
		this.map.remove(id);
	}

	@Override
	public Contact add(Contact contact) {
		Long newId = this.idCounter.incrementAndGet();
		contact.setId(newId);
		this.map.put(newId, contact);
		return contact;
	}

	@Override
	public void update(Contact contact) {
		this.map.put(contact.getId(), contact);
	}
}


З.Ы.
Хоть это и "низкий уровень", но с ним разобраться нужно. Потом конечно лучше использовать Spring MVC
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@eoffsock
Кодер (Rails)
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <uri-mapping>/*</uri-mapping>
</servlet-mapping>


class MyServlet extends HttpServlet{

      public void doGet(HttpReq req, HttpResp resp){
               StringBuffer requestURL = req.getRequestURL();
               // Тут сравниваете requestURL с необходимым и далее обрабатываете как хотите
      }

}


Но вообще это костыль, имхо.
Ответ написан
@nagibator8000
Сервлеты это низкоуровневая штука. Лучше использовать Spring MVC или что-то реализующее JAX-RS, вроде Jersey или RESTEasy.
Ответ написан
Noobkesan
@Noobkesan
java developer
Сделал так:
<web-app>
  <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>my</servlet-name>
        <servlet-class>ru.test.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>my</servlet-name>
        <url-pattern>/my1</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>my</servlet-name>
        <url-pattern>/my2</url-pattern>
    </servlet-mapping>
</web-app>


Работает.
Ответ написан
@MrBe
Используйте паттерны.
FrontController(Mediator) + Strategy
Очень хорошо об этом написано здесь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы