Софтуерно Инженерство
Loading...
+ Нов въпрос
antonsgeorgiev avatar antonsgeorgiev 3 Точки

[Java Web Development] Passing data from Servlet to a normal java class

Привет,

 

Имам въпрос относно подаване на информация от сървлет към нормален джава клас.

Сценарият е следният:

Имам един сървлет в който взимам data от сесията - usernames, passwords etc.

Трябва ми по някакъв начин от този сървлет да подам като стринг текущия username например, към метод на нормален джава клас.

Пробрах да инстанцирам сървлета в класа и да викна get method който съм направил в сървлета, но очаквано - получавам Null стойност. :)

 

Ако някой има идея - нека споделя.

Поздрави!

 

Тагове:
0
Java Web Development
TodorovH avatar TodorovH 216 Точки

Пробва ли в нормалния клас да си инстанцираш request-а и оттам да си вземеш атрибута, който си сетнал в сесията?!

0
antonsgeorgiev avatar antonsgeorgiev 3 Точки

Проблемът е, че като инсанцирам HttpServletRequest и иска да предоставя имплементация на всичките методи...

0
TodorovH avatar TodorovH 216 Точки

В случая се изразих неправилно, не го инстанцираш, а го импортваш!  И после request.getSession().getAtribute("username");

Но най-добре да покажеш кода иначе стреляме напосока! :)

 

0
antonsgeorgiev avatar antonsgeorgiev 3 Точки

В сървлет класа имам следното:

 

@WebServlet("/DynamicServlet")
public class DynamicServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private String userName;
	private double deposit;
	private double withdraw;
	
	@EJB
	private ClientCreator client;
	

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Session created: " + request.getSession().getId());
		this.userName = request.getParameter("clientName");
		request.getSession().setAttribute("clientName", this.userName);
		this.deposit = Double.valueOf(request.getParameter("transactionAmount"));
		request.getSession().setAttribute("clientEquity", this.deposit);
		System.out.println("New Client created. Name: " + userName + " amount: " + deposit);
		Client currentClient = client.createAccount(userName, deposit);
		request.getSession().setAttribute("totalEquity", currentClient.calculateTotalEquity());
		
		response.sendRedirect("/HomeworkFour/pages/LoginSuccess.jsp");
	}

 

Java class-ът (това е класът който имплементира ejb interface-a) е следния метод:

@Stateful
public class ClientCreatorImpl implements ClientCreator {
	
	private static List<Client> clientsDatabase = new ArrayList<>();
	DynamicServlet servlet = new DynamicServlet();

	@Override
	public Client createAccount(String clientName, double deposit) {
		
		
		boolean clientExists = false;
		
		if (clientsDatabase.size() == 0) {
			System.out.println("Name from servlet: " + servlet.getUserName());
			clientsDatabase.add(new Client (servlet.getUserName(), deposit));
			clientExists = true;
		} else {
			
			for (Client client : clientsDatabase) {
				if (client.getClientName().equals(clientName)) {
					clientExists = true;
				}
			}
		}
		
		if (!clientExists) {
			clientsDatabase.add(new Client (servlet.getUserName(), deposit));
		}
		return this.getClientById(Client.getClientsCounter());
	}
	
	public Client getClientById(int clientId) {
		return (clientsDatabase.get(clientId-1));
	}

 

0
deyan.zhekov avatar deyan.zhekov 159 Точки

Здравей,

това, което се опитваш няма как да стане :)

Сървлета се инстанцира и управлява от web container-a на сървъра. Твоя инстанция не би имала нищо общо с инстанцията, която се използва за обработка на request-а.

Това, което можеш да направиш е в сървлета да инстанцираш нормалния клас и да работиш с неговите методи. Това инстанциране ще се случи в момента на request-а и ще имаш данни до самия request.

По-правилния вариант е да ползваш EJB, което да Inject-неш в servlet-а и да извикваш неговите методи. По този начин няма да правиш инстанция на обикновения клас при всяко зареждане и ще можеш да ползваш член-променливи.

3
naskoni avatar naskoni 68 Точки

Точно затова, трябва да започнем с цялата бизнес логика в EJB, без да мислим за GUI - така няма да се обвържем по никакъв начин. Тестването на кода трябва да става с юнит тестове, а още по-добре е да започнем първо с тях (Test Driven Development). Чак когато имаме готова операция, можем да и направим GUI и по този начин избягваме грешката да имаме част от бизнес логиката в самия GUI. И като резултат ще имаме независима бизнес част, на която винаги ще можем да сменим GUI framework-a.

4