Você está na página 1de 74

DESARROLLO WEB INTEGRADO

ING. DENNIS LARRY QUISPE CHAVEZ


Logro de la sesión

Al finalizar la sesión de aprendizaje el estudiante


conoce e implementa un ejemplo completo
usando Spring MVC (Modelo-Vista-Controlador).
Agenda
1
2
3
4
5
6
¿Qué es un framework Web?
Un framework web es un marco de software
diseñado para simplificar su vida de desarrollo web.
Los marcos existen para evitar tener que reinventar
la rueda y ayudar a aliviar algunos de los gastos
generales cuando se está construyendo un nuevo
sitio.
¿Qué es un framework Web?
• Típicamente, el framework proporciona librerías para
acceder a una base de datos, administración de
sesiones y cookies, crear templates para mostrar
HTML y en general, permite la reutilización de
Código.
Framework Spring
• Un framework Open source para el desarrollo de aplicaciones.
• Contenedor de Inversión de control: s un estilo de
programación en el cual un framework o librería controla el
flujo de un programa. Por ejemplo: cuando creamos una
aplicación ASP.NET nosotros conocemos cuál es el ciclo de
vida de una página, pero no lo controlamos ya que
es ASP.NET el que lo hace, o cuando creamos aplicaciones de
escritorio o móviles, los formularios también tienen su ciclo
de vida que controla el framework..
• Muchas APIs
Framework Spring
• Spring framework sigue siendo extremadamente
popular en aplicaciones Java (web).
• Si va a construir aplicaciones web en Java,
seguramente vera aplicaciones con Spring.
Framework Spring
IoC (Inversion of Control) en Spring
@Service
public class UserService {

@Resource
private UserDao userDao;

public User getByUserName(String name) {


User user = userDao.getByUserName(name);
// additional actions
return user;
}
}
IoC (Inversion of Control) en Spring

@Service Declare bean, Spring will create it


public class UserService {

@Resource
private UserDao userDao;

public User getByUserName(String name) {


User user = userDao.getByUserName(name);
// additional actions
return user;
}
}
IoC (Inversion of Control) en Spring
@Service
public class UserService {

@Resource
Declare dependencies, Spring will inject them
private UserDao userDao; c
public User getByUserName(String name) {
User user = userDao.getByUserName(name);
// additional actions
return user;
}
}
IoC (Inversion of Control) en Spring
• Spring maneja la infraestructura (creación de beans,
búsqueda e inyección de dependencias)
• El desarrollador se centra en la lógica específica de la
aplicación.
Inyección de dependencias
public interface UserDao {
User getByUserName(String name);
}

@Repository
public class JdbcUserDao implements UserDao {
public User getByUserName(String name) {
// load user from DB
}
}

@Resource
private UserDao userDao;
Inyección de dependencias
public interface UserDao {
User getByUserName(String name); Universal abstraction
}

@Repository
public class JdbcUserDao implements UserDao {
public User getByUserName(String name) {
// load user from DB
}
}

@Resource
private UserDao userDao;
Inyección de dependencias
public interface UserDao {
User getByUserName(String name);
}

@Repository
public class JdbcUserDao implements UserDao { One possible
public User getByUserName(String name) {
// load user from DB implementation.
} Spring will create and
}
register it
@Resource
private UserDao userDao;
Inyección de dependencias
public interface UserDao {
User getByUserName(String name);
}

@Repository
public class JdbcUserDao implements UserDao {
public User getByUserName(String name) {
// load user from DB
}
}

@Resource Spring can inject as an


private UserDao userDao;
abstraction type
Basado en archivo de configuración XML
• El Bean puede ser definido e inyectado en XML
<bean id="userDao"
class="example.JdbcUserDao" />

<bean id="userService"
class="example.UserService">
<property name="userDao" ref="userDao" />
</bean>
Inyección de dependencias
• Su código depende de abstracciones, Spring maneja
las implementaciones reales.
• Puede cambiar implementaciones fácilmente.
¿Qué es MVC?
• El patrón Controlador de vista de modelo (MVC) es
una forma de organizar una aplicación (no
necesariamente una aplicación web) para que los
diferentes aspectos de la misma se mantengan
separados. Esto es algo bueno porque:
¿Qué es un MVC?
• Es una buena práctica de ingeniería de software
mantener la separación de preocupaciones. Una
aplicación puede tener más de una interfaz de
usuario Diferentes desarrolladores pueden ser
responsables de diferentes aspectos de la aplicación.
¿Qué es Spring MVC?
• Es una buena práctica de ingeniería de software
mantener la separación de preocupaciones.
• Una aplicación puede tener más de una interfaz de
usuario
• Diferentes desarrolladores pueden ser responsables de
diferentes aspectos de la aplicación.
¿Qué es Spring MVC?
• Marco web basado en primavera.
• Implementa el patrón de diseño Model-View-
Controller.
• Muy flexible (ya veremos cómo exactamente).
Spring MVC
• IoC nuevamente: el marco maneja la infraestructura,
usted se enfoca en cosas específicas de la aplicación.
Spring MVC
Lo que debería saber
Arquitectura - DispatcherServlet
Recordar: Modelo-Vista-Controlador
• Modelo: el modelo representa los datos
empresariales y las reglas comerciales que rigen el
acceso y las actualizaciones de estos datos.
• Vista: la vista representa el contenido de un modelo.
• Controlador: el controlador traduce las interacciones
con la vista en acciones que realizará el modelo.
Recordar: Modelo-Vista-Controlador
Controlador
@Controller
public class HelloController {

@Resource
private UserService userService;

@RequestMapping("/hello")
public String hello(Model model) {
User user = userService.getByUserName("Cartman");
model.addAttribute("user", user);

return "hello";
}
}
Controlador
@Controller
public class HelloController {

@Resource Declare controller


private UserService userService;

@RequestMapping("/hello")
public String hello(Model model) {
User user = userService.getByUserName("Cartman");
model.addAttribute("user", user);

return "hello";
}
}
Controlador
@Controller
public class HelloController {

@Resource
private UserService userService; Inject Spring resources
@RequestMapping("/hello")
public String hello(Model model) {
User user = userService.getByUserName("Cartman");
model.addAttribute("user", user);

return "hello";
}
}
Controlador
@Controller
public class HelloController {

@Resource
private UserService userService;

@RequestMapping("/hello")
public String hello(Model model) { Method for handling
User user = userService.getByUserName("Cartman"); requests
model.addAttribute("user", user);

return "hello";
}
}
Controlador
@Controller
public class HelloController {

@Resource
private UserService userService;

@RequestMapping("/hello")
public String hello(Model model) {
User user = userService.getByUserName("Cartman");
model.addAttribute("user", user);

return "hello";
}
What requests to serve?
}
Controlador
@Controller
public class HelloController {

@Resource
private UserService userService;

@RequestMapping("/hello")
public String hello(Model model) {
User user = userService.getByUserName("Cartman");
model.addAttribute("user", user);
Prepare model data
return "hello";
}
}
Controlador
@Controller
public class HelloController {

@Resource
private UserService userService;

@RequestMapping("/hello")
public String hello(Model model) {
User user = userService.getByUserName("Cartman");
model.addAttribute("user", user);

return "hello"; Logical view name


}
}
Modelo
• Conjunto de atributos que el Controlador recopila y
pasa a la Vista.
Modelo
• Modelo de objetos Spring
@RequestMapping(value="/hello")
public String hello(Model model) {
User user = userService.getByUserName(“cartman");
model.addAttribute("user", user);
...
Modelo
• O planea el java.util.Map

@RequestMapping(value="/hello")
public String hello(Map<String, Object> model) {
User user = userService.getByUserName("cartman");
model.put("user", user);
...
Vista
• Cualquier representación de salida, invocada
después del Controlador, usa datos del Modelo para
renderizarse.
View technologies
Usually Java Server Pages that generate HTML.
Out-of-the-box there are also PDF, XML, JSON, Excel and
other views.
You can create your own.
View
Controller is totally decoupled from actual view
technology.
@RequestMapping("/hello")
public String hello() {
...
return "hello"; Just a logical view
}
name to be invoked
JSP View
class="org.springframework...InternalResourceViewRes
olver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

"hello” /WEB-INF/jsp/hello.jsp
JSP view (hello.jsp)
Model attributes are accessible as EL (Expression
Language) variables in JSP.

JSP: <p>Hello, ${user.fullName}!</p>

HTML: <p>Hello, Eric Cartman!</p>


JSON view
JSON view transforms the whole model to JSON
format.
<bean class="org.springframework...ContentNegotiatingViewResolver">
<property name="defaultViews">
<list>
<bean class="org.springframework...MappingJacksonJsonView" />
</list>
</property>
</bean>
JSON view
Outputs the Model as JSON document.

{"user":{"fullName":"Eric Cartman"}}
Request Mapping
@RequestMapping("/hello")

@RequestMapping(value="/hello", method=RequestMethod.GET)

@RequestMapping(value="/hello", params= {"param1", "param2"})

@RequestMapping(value="/hello", consumes="application/json",
produces="application/json")
Path variables

@RequestMapping(value="/hello/{username}")
public String hello(
@PathVariable String username,
Model model) {
...

http://[SERVER]/hello/cartman
Path variables
@RequestMapping(value="/hello/{username}")
public String hello(
@PathVariable String username,
Model model) {
...
http://[SERVER]/hello/cartman
Request Parameter
@RequestMapping(value="/hello")
public String hello(
@RequestParam("username") String
username,
Model model) {
...
http://[SERVER]/hello?username=cartman
Type conversion
HttpServletRequest parameters, headers, paths etc are all
Strings.
Spring MVC allows you to convert to and from Strings
automatically.
Built-in conversion
There are some standard built-in converters.

@RequestMapping("/foo")
public String foo(
@RequestParam("param1") int intParam,
@RequestParam("param2") long longParam)
{
...
Type conversion
You can also define your own PropertyEditors
PropertyEditorSupport implements PropertyEditor
Custom Types
public class DateRange {

private Date start;


private Date end;

public DateRange(Date start, Date end) {


this.start = start;
this.end = end;
}

public int getDayDifference() {


// calculate
}
}
Custom type editor
public class DateRangeEditor extends PropertyEditorSupport {

private DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");

public void setAsText(String text) throws IllegalArgumentException {


String[] parts = text.split("-");
String to custom type
Date start = dateFormat.parse(parts[0]);
Date end = dateFormat.parse(parts[1]);

setValue(new DateRange(start, end));


}

public String getAsText() {


DateRange dateRange = (DateRange) getValue();
Custom type to String
return dateFormat.format(dateRange.getStart()) + "-" +
dateFormat.format(dateRange.getEnd());
}
}
Register and user
@Controller
public class MyController {

@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(DateRange.class,
new DateRangeEditor());
}

@RequestMapping(value="/dateRange")
public String dateRange(@RequestParam("range") DateRange range) {
...
}
}
Method parameters
It all about IoC and Convention Over Configuration.
Your code simply declares what it needs from the environment,
Spring makes it happen.
The order is not important, the type is.
Method parameters
Model/Map – model

@RequestParam/@PathVariable annotated

HttpServletRequest, HttpServletResponse, HttpSession – it is all


based on Servlet API!
Method parameters
java.io.Writer / java.io.OutputStream – if you want to
generate response directly in controller

Method parameters
For example

@RequestMapping(value="/hello")
public String hello(Model model,
Writer writer, HttpServletRequest request,
HttpSession session) {
...
Return values
Same principle – you return what Spring awaits from you.
Return value examples
String – logical view name.
void
If you write the response in controller
If you use default/content negotiating views (like JSON earlier)

Non-intrusive
Very important feature of a framework is non-
intrusiveness.
Spring MVC normally lets you do stuff according to MVC
pattern.
But it doesn’t prevent you from violating MVC if you
really want to.
No view examples
@RequestMapping(value="/noView")
@ResponseBody
public String noView() {
return "Too simple for a view";
}

@RequestMapping(value="/noView")
public void noView(Writer writer) {
writer.write("Too simple for a view");
}
Form
First you need to give Spring a new command object

@RequestMapping(value="/addUser")
public String add(Model model) {
model.addAttribute("user", new User());
return "add";
}
Command objetc
public class User {

private String fullName;


private int age;

// getters/setters
...
Form JSP
<%@ taglib prefix="form"
uri="http://www.springframework.org/tags/form"%>

<form:form commandName="user">
<form:input path="fullName" />
...
<form:input path="age" />
...
<input type="submit" value="Add" />
</form:form>
Form
Spring will bind the data to our command
object
@RequestMapping(value="/addUser", method=RequestMethod.POST)
public String save(User user) {
// save user

return "home";
}
Validation
JSR-303 defines constraint annotations:
public class User {

@NotNull
@Size(max=20)
private String fullName;

@Min(10)
private int age;
...
Validation
@RequestMapping(value="/addUser", method=RequestMethod.POST)
public String save(@Valid User user, BindingResult result,
Model model) {

if (result.hasErrors()) { Check for validation errors.


model.addAttribute("user", user);
return "add";
Render the same view in case of
}
errors
// save user
return "home";
}
Validation
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<form:form commandName="user">
<form:input path="fullName" />
<form:errors path="fullName" />
...
<form:input path="age" />
<form:errors path="age" />
...
<input type="submit" value="Add" />
</form:form>
Validation
It is of course possible to define your own
constraints and validators.
Sources of wisdom
Spring has great documentation:
http://www.springsource.org/spring-framework#documentation
Java BluePrints - Model-View-Controller
http://www.oracle.com/technetwork/java/mvc-detailed-
136062.html
Model-View-Controller
http://www.oracle.com/technetwork/java/mvc-140477.html
Inversion of control
http://en.wikipedia.org/wiki/Inversion_of_control
ACTIVIDAD

Implementar el ejemplo Spring MVC de la siguiente url

https://www.journaldev.com/14476/spring-mvc-example
Gracias!

Você também pode gostar