Wicket kérdések

Fórumok

Hello,

Kezdem magam beleásni a $subj. rejtelmeibe. Néhány gyakorlati tanácsra lenne szükségem:

1. Hogy tároljam a már authentikált userem adatait session szinten (alapadatok, user profile) ?
2. Ugyanez a kérdés az alkalmazás szintű paramétereket kezelésére.

Gyakorlati megoldások érdekelnének elsősorban, de egy linknek is örülnék.
Köszi.

3. Spring Security annotations

A doksik alapján próbáltam összerakni, de nem működik a @Secured annotáció. Az @AuthorizeInstantiation("ROLE_ADMIN") viszont igen.
Ne várjam, h az első változat menjen, mert itt már csak a wicket-auth játszik ?

http://pastebin.com/tFNPF49y

Köszi.

Hozzászólások

1. Bevagod a adatokat tartalmazo bean-t sessionba.
2. Bevagod a adatokat tartalmazo bean-t servletcontext-be.

get/setAttribute()...

Kulcsszavak: wicket+servlet+session, wicket+servletcontext...

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

Tudsz saját session objektumot csinálni, amivel azt csinálsz amit akarsz:

public class MySession extends WebSession {
public MySession(Request request) {
super(request);
}
private String myString;
private Date myDate;
private CustomOwnObject myCustomObject;
// ... getters and setters
}

Application class-ban:


@Override
public Session newSession(Request request, Response response) {
return new MySession(request);
}

Aztán bárhonnan elérheted a kódból:

MySession session = (MySession )WebSession.get();

3.

Spring bean-eknél működik a @Secured.

pl.

public class SimplePage extends WebPage {

@SpringBean
private SpringService helloService;

ahol a service

import org.springframework.security.access.annotation.Secured;

@Secured("ROLE_ADMIN")
public interface SpringService {

String HelloWorld();

}

Létrehoztam egy Application.properties nevű állományt, raktam bele két sort.

application.name=X
application.version=v1.0


public final class LoginPage extends WebPage {

    public LoginPage() {
        this(null);
    }

    public LoginPage(final PageParameters parameters) {
        add(new LoginForm("loginform"));
        String s = new StringResourceModel("application.version",this,null).getString();        
        add(new Label("appinfo",s));                    
    }

Mindegy mit csinálok, nem bírja megtalálni, mindegy hova rakom a fájlt (resources vagy a webapp ahol a html,css van..).

Gyártottam egy menüt:


public class PageWithMenu extends Panel {
    
    public PageWithMenu(String id,List<MenuItem> menu) {
        super(id);
        RepeatingView rv = new RepeatingView("menu");
        add(rv);
        for (MenuItem item : menu) {
            WebMarkupContainer parent = new WebMarkupContainer(rv.newChildId());
            rv.add(parent);
            BookmarkablePageLink link = new BookmarkablePageLink("link", item.getDestination());
            parent.add(link);
            link.add(new Label("caption",item.getCaption()));
        }
    }

Ehhez a markup:


<wicket:panel>
        <ul class="glossymenu">
                <li wicket:id="menu" >
                   <a href="#" wicket:id="link">
                   <b><span wicket:id="caption"></span></b></a>
                </li>
        </ul>   
        </wicket:panel>

Szeretném megoldani, h az egyes menüpontokon bekövetkező onClick-re az adott ul class tulajdonsága current legyen.
A BookMarkableLink-nek nem tudom override-olni az onClick metódusát,a Link meg ugye absztrakt.

Köszi!

Pl. így:


public class MenuPanel extends Panel
{
	private static final long serialVersionUID = 1L;

	public MenuPanel(String id)
	{
		super(id);
	}

	@Override
	protected void onInitialize()
	{
		super.onInitialize();

		List<Class<? extends WebPage>> pageClasses = new ArrayList<Class<? extends WebPage>>();
		pageClasses.add(FooPage.class);
		pageClasses.add(BarPage.class);

		RepeatingView menu = new RepeatingView("menu");
		add(menu);

		for (Class<? extends WebPage> pageClass : pageClasses)
		{
			WebMarkupContainer item = new WebMarkupContainer(menu.newChildId());
			menu.add(item);
			Link<Void> link = new BookmarkablePageLink<Void>("link", pageClass);
			item.add(link);

			if (getPage().getClass().equals(pageClass))
			{
				link.add(AttributeModifier.append("class", "current"));
			}
		}
	}
}

Ebben az esetben nem onclick-re dől el, hogy kell -e a class, hiszen az oldal példányosításakor már tudod, hogy melyik link tartozik hozzá. Az oldal onInitialize-ban már ismert. (Az "AttributeModifier.append()" lehet, hogy 1.5 only, de ha 1.4-et használsz, akkor abban is meg kell lennie a párjának. Ez a fajta appender nem törli, ha van másik class a linken (pl.: markup-ból), hanem hozzáfűzi a current-et.)

"a Link meg ugye absztrakt"
Attól még nyugodtan lehet használni, ha kell:


new Link<Void>("link")
{
	@Override
	public void onClick()
	{
		// TODO Auto-generated method stub
	}
}

public class PageWithMenu extends Panel {
    
    public PageWithMenu(String id,List menu) {
        super(id);
        RepeatingView rv = new RepeatingView("menu");
        add(rv);
        for (MenuItem item : menu) {
            WebMarkupContainer parent = new WebMarkupContainer(rv.newChildId());
            rv.add(parent);
            BookmarkablePageLink link = new BookmarkablePageLink("link", item.getDestination());
            parent.add(link);
            link.add(new Label("caption",item.getCaption()));
        }
    }

Ebben az esetben a konstruktorban nem tudtam Link-et hozzáadni, ezért gondoltam, h a Link absztrakt mivolta miatt nem megy.
Mindegy is, @Exit tollából a másik megközelítés lesz a nyerő :)