Web-framework

Report
Web-framework
Framework-ök
•
Felsorolás
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
Struts
Turbine
Tapestry
Spring
SwingWeb
Cocoon
WebWork
Maverick
Anvil
RIFE
SOFIA
Caramba
Stripes
OpenXava
Barracuda
Amivel foglalkozunk
• Maverick
• ActionController
• Spring-MVC
Maverick
Maverick
• Struts kistestvére
– Sokkal egyszerűbb
• Mi a cél?
–
–
–
–
Bonyolult a servlet-programozás egyszerűsítés
Nagyméretű servletek helyett  kis méretű modulok
Komplex vezérlési folyamat egyszerű leírása
Könnyű átláthatóság
• Megoldás
– Standard servlet használata
– Folyamatleírás xml-ben  maverick.xml
Szerkezete
• MVC alapokon
• Modellel itt nem foglalkozunk
– V (view) és C (controller) a kérdés
• Központban
– maverick.xml nevű Maverick-leíró
– speciális web.xml
Példa maverick.xml-re
vezérlő logikai neve
vezérlő-osztály
<?xml version="1.0"?>
<maverick version="2.0">
<commands>
<command name="runQuery">
<controller class="com.bar.foo.Query"/>
<view name="success" type="document" path="queryResult.jsp">
</view>
<view name="error" type="document" path="queryFailed.jsp">
</view>
</command>
</commands>
</maverick>
megjelenítő view
vezérlő kimenete
Működés folyamata
<?xml version="1.0"?>
<maverick version="2.0">
<commands>
<command name="runQuery">
<controller class="com.bar.foo.Query"/>
<view name="success" type="document" path="queryResult.jsp">
</view>
<view name="error" type="document" path="queryFailed.jsp">
</view>
</command>
</commands>
</maverick>
•
•
•
•
(Valahogyan) megkapta a runQuery vezérlő (controller) a vezérlést
– Ez azt jelenti, hogy a com.bar.foo.Query osztály perform metódusa
kapja a vezérlést
Beindul a C-elem, használja az M-elemeket
– A perform kimenete „success” vagy „error” string
Ha „success” a perform kimenete, akkor a queryResult.jsp kapja a
vezérlést
– A bean-eket már a controller előzetesen elkészítette
Ha „error” a kimenet, akkor a queryFailed.jsp kapja a vezérlést
Hogyan kap a controller vezérlést?
• A leírás a web.xml-ben található
<web-app>
<display-name>Friendbook Web Application</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<display-name>Maverick Dispatcher</display-name>
<servlet-class>org.infohazard.maverick.Dispatcher</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.m</url-pattern>
maverick-servlet
</servlet-mapping>
</web-app>
servlet hívás url-mintája
• Bármely *.m formájú URL beindítja a maverick-et
Nyelvi váltás
request-header Accept-Language eleme alapján
<?xml version="1.0"?>
<maverick version="2.0" default-view-type="document" >
<modules>
<shunt-factory provider="org.infohazard.maverick.shunt.LanguageShuntFactory"/>
</modules>
<commands>
<command name="runQuery">
<controller class="com.bar.foo.Query"/>
<view name="success" path="en/queryResult.jsp"></view>
<view name="success" mode="fr" path="fr/queryResult.jsp"></view>
<view name="success" mode="de" path="de/queryResult.jsp"></view>
<view name="error" type="document" path="en/queryFailed.jsp"></view>
<view name="success" mode="fr" path="fr/queryFailed.jsp"></view>
<view name="success" mode="de" path="de/queryFailed.jsp"></view>
</command>
</commands>
</maverick>
mód specifikátor
Paraméterek be- és kifelé
<?xml version="1.0"?>
<maverick version="2.0" default-view-type="document" >
bemeneti paraméter
<commands >
<command name="runQuery">
<controller class="com.bar.foo.Query"/>
<param name="color" value="red"></param>
</controller>
<view name="success" path="queryResult.jsp"></view>
<param name="color" value="blue"></param>
</view>
</command>
</commands>
</maverick>
kimeneti paraméter
Referenciák
<?xml version="1.0"?>
<maverick version="2.0" default-view-type="document" >
oldal id-val
<views>
<view id="loginRequired" path="loginRequired.jsp">
<transform path="trimOutside.jsp"/>
</view>
<view id="loginFailed" path="loginFailed.jsp">
<transform path="trimOutside.jsp"/>
</view>
</views>
<commands>
<command name="welcome">
...
</command>
<command name="weblog">
<controller class="org.wafer.ctl.WebLog"/>
<view name="loginRequired" ref="loginRequired" />
<view name="loginFailed" ref="loginFailed"/>
<view name="success" path="weblog.jsp">
<transform path="trimInside.jsp"/>
</view>
</command>
</commands>
</maverick>
hivatkozás az oldalra
Controller programozás
• Java osztályok
– Servlet
• alaposztály
– org.infohazard.maverick.Command
• öröklődéssel maverick-alaposztályból újat is lehet
– Controller
• perform metódus szükséges!
• különféle típusok
– ThrowAway
– FormBeanUser
– ThrowAwayFormBeanUser
:itt makeFormBean
:itt makeFormBean
Példa Controller-re
public abstract class ProtectedController extends ThrowAwayFormBeanUser {
private HttpSession session;
protected String perform() throws Exception {
// ellenorzes
ControllerContext ctx = this.getCtx();
session = ctx.getRequest().getSession();
HibaTar bean = new HibaTar();
if (session.getAttribute("logged_in") == null) {
bean.put("default", "Kérjük jelentkezzen be!");
ctx.setModel(bean);
return "login";
}
return protectedPerform();
}
/**
*
* @return
*/
protected abstract String protectedPerform();
/**
* @return
*/
public HttpSession getSession() {
return session;
}
}
JSP oldalak készítése
•
•
•
•
„Hagyományos” módon
Bean-ek a controllerekben készülnek
JSTL alkalmazása
form-elem pl. így:
<form name="form1" action="/appl/LoginSubmit.m" method="post">
Egyéb template lehetőségek
• JSP az alap-template
• Még vannak
– FOP: pdf-oldalak készítésére
– Velocity: új fajta template
– Domify: XML/XSL alapú oldalak
ActionController
ActionController
• Saját fejlesztés
• Mi a cél?
–
–
–
–
Bonyolut a servlet-programozás egyszerűsítés
Nagyméretű servletek helyett  kis méretű modulok
Komplex vezérlési folyamat egyszerű leírása
Könnyű átláthatóság
• Megoldás
– Standard servlet használata
– Folyamatleírás a servlet-be
Szerkezete
• MVC alapokon
• Modellel itt nem foglalkozunk
– V (view) és C (controller) a kérdés
• Iniciálás
– initActions() abstract metódus
• Process{X}  osztálynév típusú lista
– initPages() abstract metódus
• AZONOSITO  oldal.jsp típusú lista
Működés lényege
•
Van egy form
–
•
A kattintás hatására
–
–
–
–
–
–
–
•
Elindul egy vezérlő, ami az ActionController ősosztályából származik
Bemegy a proc változó is
Innen képződik egy Process{proc} azonosító
Az Actions-összerendelésből kiderül, hogy melyik akció kap vezérlést
Az akció úgy kap vezérlést, hogy az osztály perform metódusa indul el
Az akció egy string változóval tér vissza; ez egy Pages-azonosító
Ennek alapján a vezérlés egy jsp oldalra megy ki
Az akciók ősosztálya Action abstract osztály
–
–
•
Ennek van egy proc hidden változója
Default konstruktor kell
Csak perform metódusa van
Bean-ek használata a szokásos módon
–
Egyetlen session-bean, ami egy nagy struktúra
Servlet-iniciálás
..
public class JspController extends ActionController {
public static final String PREPARESOKHELYSEG = "VAROSOK";
..
// abstract metódus
public void initActions() {
if (actions == null) {
actions = new Hashtable();
actions.put("ProcessBevitel", new ProcessBevitel());
..
}
}
// abstract metódus
public void initPages() {
if (pages == null) {
pages = new Hashtable();
pages.put(PREPARESOKHELYSEG, "soktelepules.jsp");
..
}
}
..
}
Controller készítés
..
public class ProcessBevitel extends Action {
//ez az egyetlen szükséges metódus
public String perform(HttpRequest request, HttpResponse response, ActionSession session) {
//továbblépő oldal
String forwrd = null;
//session átkódolása
JspSession sess = (JspSession)session;
//bemenő paraméterek beolvasása
String xx = request.getParameter(”xx”);
...
//feldolgozás, benne bean-ek készítése és forwrd beállítása
...
return forwrd;
}
..
}
Spring-MVC
Spring-MVC
• Valójában ez egy framework csomag
– Az MVC-rész mellett egyéb részek is fontosak (előadáson később)
• Mi a cél?
–
–
–
–
Bonyolult a servlet-programozás egyszerűsítés
Nagyméretű servletek helyett  kis méretű modulok
Komplex vezérlési folyamat egyszerű leírása
Könnyű átláthatóság
• Megoldás
– Standard servlet használata
– Folyamatleírás xml-ben
Szerkezete
• MVC alapokon
• Modellel itt nem foglalkozunk
– V (view) és C (controller) a kérdés
• Központban
– x-servlet.xml nevű Spring-leíró
– speciális web.xml
Vezérlő xml-ek
web.xml
<?xml version="1.0"?>
<webapp ... >
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
http://host:port/hello_world.html
</webapp>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...">
springmvc-servlet.xml
<bean name="/hello_world.html" class="springmvc.web.HelloWorldController"/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
Egyszerű controller
public class HelloWorldController implements Controller {
HelloWorldController.java
public ModelAndView handleRequest(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
jsp/hello_world.jsp
String aMessage = "Hello World MVC!";
ModelAndView modelAndView = new ModelAndView("hello_world");
modelAndView.addObject("message", aMessage);
return modelAndView;
}
}
request-bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ...">
springmvc-servlet.xml
<bean name="/hello_world.html" class="springmvc.web.HelloWorldController"/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
HelloworldController osztály
public class HelloWorldController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String aMessage = "Hello World MVC!";
ModelAndView modelAndView = new ModelAndView("hello_world");
modelAndView.addObject("message", aMessage);
//request-bean!!
return modelAndView;
}
}
Request-bean használata
• Objektum hozzáadása a ModelAndView-hoz
– Ez egy request hatókörű bean lesz
– A hozzáadás paramétere a bean string-azonosítója
• Hívás a jsp-ben
– String-azonosító alapján
Form-controller
CarNewController.java
public class CarNewController implements SimpleFormController {
...
public ModelAndView onSubmit(Object command) throws ServletException {
CarManager carManag = new CarManager();
carmanag.createCar((Car)command);
return modelAndView(getSuccessView());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" ... >
springmvc-servlet.xml
<bean name="/hello_world.html" class="springmvc.web.HelloWorldController"/>
űrlap-objektum
<bean name="/new_car.html" class="springmvc.web.CarNewController" />
<property name="commandClass" value="springmvc.model.Car"/>
<property name="formView" value="carView"/>
űrlap-oldal
<property name="successView" value="list_cars.html">
<property name ="validator" >
továbblépés
<bean class="springmvc.validator.CarValidator”/>
</property>
</bean>
...
objektum ellenőrzés
</beans>
Form controll működése
<bean name="/new_car.html" class="springmvc.web.CarNewController" />
<property name="commandClass" value="springmvc.model.Car"/>
<property name="formView" value="carView"/>
<property name="successView" value="list_cars.html">
<property name ="validator" >
<bean class="springmvc.validator.CarValidator”/>
</property>
</bean>
•
Url-minta alapján egy hívás
–
–
•
Minta leírása a web.xml-ben: például *.html az url-minta
Hívás direktben vagy egy forma akciójában
Beindul a formView-elem GET metódussal
–
Ez tartalmaz egy <form> elemet, ahol
–
A <form> input-elemei a commandClass-ban
•
•
•
carView /jsp/carView.jsp
class Car, aminek objektumváltozóit használjuk
Elküldés POST-tal
–
–
A bemeneti adatokra beindul a validator
Ha ez sikeres, akkor a feldolgozó class meghívódik
•
Ennek végén a successView-beli oldal kap vezérlést
–
A vezérlést itt is ModelAndView(…) metódus adja át
Session bean-ek használata
• Bean, mint osztály elkészítése
• Bean definiálása a spring-vezérlőben
<bean id="session" class="hu.brasso.springmvc.util.JspSession"
scope="session" init-method="initSession" >
<aop:scoped-proxy/>
</bean>
• Getter/setter a bean-re a controllerbe
– get/set használata controller-en belül
• Jsp-ben használni lehet
Session bean példa
springmvc-servlet.xml
…
<bean id="session„ class="hu.brasso.springmvc.util.JspSession" init-method="initSession"
scope="session" >
<aop:scoped-proxy/>
</bean>
…
LoginController osztály
public class LoginController extends SimpleFormController {
private JspSession sess;
protected ModelAndView processFormSubmission(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors) throws Exception {
...
sess.setHufa(cmdObj.getUsername());
sess.setLogin(new Date());
...
}
public JspSession getSess() {
return sess;
}
public void setSess(JspSession sess) {
this.sess = sess;
}
}
Bean-ek Spring-MVC-vel
• Request-bean
• a controller-leíróban
– minden form-hoz külön bean: commandClass
• Kilépéskor paraméterként
return new ModelAndView("hello_world”, "message", aMessage);
• Session-bean
• kicsit nehézkesebb a kezelése
• referenciával hivatkozni rá
• controller-osztályban külön getter/setter
JSP oldalak készítése
• „Hagyományos” módon
• Bean-ek a controllerekben készülnek
• JSTL alkalmazása
– form-elem pl. így:
<form:form method="post" name="form1" commandName="Login">
…
<td>
<form:password path="password" cssClass="Input1" /><br>
<form:errors path="password" cssClass="Hiba" />
</td>
…
</form:form>

similar documents