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 Mi a cél? Megoldás Sokkal egyszerűbb 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 Központban 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ó Bármely *.m formájú URL beindítja a maverick-et <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> <url-pattern>*.m</url-pattern> </servlet-mapping> </web-app> maverick-servlet servlet hívás url-mintája
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é bemeneti paraméter <?xml version="1.0"?> <maverick version="2.0" default-view-type="document" > <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 oldal id-val hivatkozás az oldalra <?xml version="1.0"?> <maverick version="2.0" default-view-type="document" > <views> <view id="loginRequired" path="loginRequired.jsp"> <transform path="trimOutside.jsp"/> </view> <view id="loginFailed" path="loginFailed.jsp"> </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"/> </commands> </maverick> oldal id-val 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 :itt makeFormBean ThrowAwayFormBeanUser :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(); 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? Megoldás 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 Iniciálás 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 Ennek van egy proc hidden változója 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 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 Mi a cél? Megoldás 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 Központban 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> <url-pattern>*.html</url-pattern> </servlet-mapping> </webapp> http://host:port/hello_world.html springmvc-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ..."> <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 jsp/hello_world.jsp request-bean HelloWorldController.java 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); return modelAndView; } jsp/hello_world.jsp request-bean springmvc-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ..."> <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()); } springmvc-servlet.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ... > <bean name="/hello_world.html" class="springmvc.web.HelloWorldController"/> <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> ... </beans> űrlap-objektum űrlap-oldal továbblépés objektum ellenőrzés
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 carView /jsp/carView.jsp A <form> input-elemei a commandClass-ban 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 Getter/setter a bean-re a controllerbe get/set használata controller-en belül Jsp-ben használni lehet <bean id="session" class="hu.brasso.springmvc.util.JspSession" scope="session" init-method="initSession" > <aop:scoped-proxy/> </bean>
Session bean példa springmvc-servlet.xml LoginController osztály … <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 Session-bean kicsit nehézkesebb a kezelése referenciával hivatkozni rá controller-osztályban külön getter/setter return new ModelAndView("hello_world”, "message", aMessage);
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>