Spring Framework: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 1:
= Простой проект =
Для первого знакомства создадим проект по управлению пользователями.
Пользователей можно смотреть, добавлять, удалять и изменять. Все очень просто.
 
Что нужно для работы:
 
* Apache Tomcat 7.0.22
* Java SDK 7
* Ant 1.7
* Spring Framework 3.1.1
* NetBeans IDE 7.1
 
Манифест-файл приложения - web.xml.
В нем мы определяем что все что в запросе соответствуем паттерну *.htm
должно обрабатываться DispatcherServlet из Spring-а.
Также установим страницу по умолчанию в redirect.jsp:
<source lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
</web-app>
</source>
 
Файл dispatcher-servlet.xml
<source lang="xml">
Строка 13 ⟶ 60 :
 
<context:component-scan base-package="org.app.controller" />
<context:component-scan base-package="org.app.service" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean id="viewResolver"
Строка 21 ⟶ 68 :
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
 
 
</beans>
</source>
 
Контроллер - org.app.controller.UserController.java
<source lang="java">
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.app.controller;
 
import org.app.domain.User;
import org.app.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validationweb.BindingResultbind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
/**
*
* @author alec
*/
@Controller
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping(value="/index.htm", method=RequestMethod.GET)
public String userIndexindex(Model model) {
//model.addAttribute(new User());
model.addAttribute("accounts", userService.getAll());
return "index";
}
@RequestMapping(value="/user/create.htm", method=RequestMethod.GET)
public String userCreatecreateUser(@ModelAttribute("userAttribute") User account, Model model) {
return "usercreate";
}
@RequestMapping(value="/user/update/{id}.htm", method=RequestMethod.GET)
public String updateUser(@PathVariable Long id, @ModelAttribute("userAttribute") User account, Model model){
for(User us : userService.getAll()){
if(us.getId().longValue() == id.longValue()){
account.setId(us.getId());
account.setName(us.getName());
model.addAttribute("userAttribute", account);
break;
}
}
return "userupdate";
}
@RequestMapping(value="/user/delete/{id}.htm", method=RequestMethod.GET)
public String deleteUser(@PathVariable Long id, Model model){
userService.deleteUser(id);
return "redirect:/index.htm";
}
@RequestMapping(value="/user/save.htm", method=RequestMethod.POST)
public String saveUser(@ModelAttribute("userAttribute") User account, Model model) {
if(account.getId() == null){
this.userService.addUser(account);
} else {
this.userService.updateUser(account);
}
return "redirect:/index.htm";
}
}
</source>
Представление - состоит из 4 файлов JSP: redirect, index, createuser и updateuser:
 
redirect.jsp
<source lang="java">
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% response.sendRedirect("index.htm"); %>
</source>
 
index.jsp
<source lang="java">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
Строка 72 ⟶ 155 :
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>WelcomeUser to Spring Web MVC projectcatalog</title>
</head>
 
<body>
<a href="user/create.htm">create</a><br/>
<c:forEach items="${accounts}" var="car">
username: ${car.name} <a href="user/update/${car.id}.htm">update</a> <a href="user/delete/${car.id}.htm">delete</a>
<br />
</c:forEach>
</body>
</html>
Строка 82 ⟶ 170 :
usercreate.jsp
<source lang="java">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
Строка 91 ⟶ 181 :
<body>
<h1>Create user</h1>
<c:url var="saveUrl" value="/user/save.htm" />
<form:form modelAttribute="userAttribute" method="POST" action="${saveUrl}">
User:
<form:input path="name"></form:input>
<input type="submit" value="Save" />
</form:form>
</body>
</html>
 
</source>
userupdate.jsp
<source lang="java">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Update user</h1>
<c:url var="saveUrl" value="/user/save.htm" />
<form:form modelAttribute="userAttribute" method="POST" action="${saveUrl}">
<form:hidden path="id" />
User:
<form:input path="name"></form:input>
<input type="submit" value="Save" />
</form:form>
</body>
</html>
</source>
 
Интерфейс сервиса org.app.service.IUserService
<source lang="java">
package org.app.service;
 
import java.util.List;
import org.app.domain.User;
 
public interface IUserService {
List<User> getAll();
void updateUser(User user);
void deleteUser(Long id);
void addUser(User user);
}
</source>
... и его реализация
<source lang="java">
 
package org.app.service;
 
import java.util.ArrayList;
import java.util.List;
import org.app.domain.User;
import org.springframework.stereotype.Service;
 
@Service
public class UserService implements IUserService{
 
List<User> users = new ArrayList<User>();
public UserService() {
init();
}
 
private void init(){
users.add(new User(Long.valueOf(1), "aaa"));
}
@Override
public List<User> getAll() {
return users;
}
 
@Override
public void updateUser(User user) {
for (User us : users) {
if (us.getId().longValue() == user.getId().longValue()) {
int index = users.indexOf(us);
users.set(index, user);
break;
}
}
}
 
@Override
public void deleteUser(Long id) {
for(User u : users){
if(u.getId().longValue() == id.longValue()) {
users.remove(u);
break;
}
}
}
 
@Override
public void addUser(User user) {
Long l = Long.MAX_VALUE;
for (User u : users) {
l = u.getId();
}
user.setId(l + 1);
users.add(user);
}
}
 
</source>
 
Сущность пользователя с которой мы работаем - org.app.domain.User:
<source lang="java">
 
package org.app.domain;
 
import com.sun.istack.internal.NotNull;
import java.util.concurrent.atomic.AtomicLong;
 
public class User {
private Long id;
@NotNull
private String name;
private static final AtomicLong idSequence = new AtomicLong();
 
public User() {
}
public User(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
 
public void setId(Long id) {
this.id = id;
}
 
public String getName() {
return name;
}
 
public void setName(String name) {
this.name = name;
}
Long assignId() {
this.id = idSequence.incrementAndGet();
return id;
}
}
 
</source>