Change page name in Tapestry - java

I'm beginner with Tapestry. I have a component called Navigation, where I dynamically get the pageName of my web pages, and display the link in header of a website. Here's the relevant part:
<t:loop source="pages" value="row">
<li><t:pagelink t:page="${page}">${pageName}</t:pagelink></li>
</t:loop>
That works ok.
I have page About_us.tml, and About_us.java. That page contains only text, so it's simple. My problem is, that my Navigation component displays this page in header (where are links to all of the pages of my web app) as About_us link. I want to change this to About us link. I don't want the "_" sign.
Any idea how could I possibly solve this?
Thanks.

It's very easy to pass the pageName through a bit of Java code to prepare it to be presented.
public String prepare(String pageName) { return pageName.replace("_", " "); }
and
<t:pagelink ...>${prepare(pageName)}</t:pagelink>

Related

How to query the database by clicking a link in a jsp file

hi i want to add a news section to my site.
so that the news list is shown in newslist.jsp and when the user clicks on news another page is opended with the link of for example shownews.jsp?id=1 and for every news eech id is diffrent.
would you please someone told me how to do that?
i just want teh logic behind it.i know how to write jsp and servlet and how to coonect to dadatabse,but i dont know how to write the code so that when the user clicks on the links the user forward to the appropriate page with the proper ID
Use anchor tag in your jsp page with attribute target="_blank"
for example:
News Name

HTMLUnit/Java - Form is not found

I have very recently started using HTMLUnit. My goal is to automate logging into another website (I am using this as my guide). However, my code is unable to find the form (of the website I am trying to log into) by ID, even though I gave it the forms id.
Website Form HTML Code:
<form id="site-login-form" action="/podium/blank.html">
My code:
final HtmlForm form = (HtmlForm) page1.getElementById("site-login-form");
System.out.println("Found form");
System.out.println(form);
When I try to print the form data (as seen above), null is printed instead.
I would really appreciate your help, thanks.

Easiest way to "browse" to a page and submit form in Java

What I need to do is browse to a webpage, login, then browse to another webpage on that site that requires you to be logged in, so it needs to save cookies. After that, I need to click an element on that page, in which I would fill out the form and get the message that the webpage returns to me. The reason I need to actually go to the page and click the button as suppose to just navigating directly to the link is because the you are assigned a session ID every time you log in and click the link, and its always different. The button looks like this, its not a normal href link:
<span id=":tv" idlink="" class="sA" tabindex="0" role="link">Next</span>
Anyway, what would be the easiest way to do this? Thanks.
Update:
After trying HTMLunit, and other headless browser libraries, it doesnt seem that its happening using anything "headless." Another thing that I recently found out about this page is that that all the HTML is in some weird format... Its all inside a script tag. Here is a sample.
"?ui\x3d2\x26view\x3dss\x26mset\x3dmain\x26ver\x3d-68igm85d1771\x26am\x3d!Zsl-0RZ-XLv0BO3aNKsL0sgMg3nH10t5WrPgJSU8CYS-KNWlyrLmiW3HvC5ykER_n_5dDw\x26fri"],"http://example.com/?ctx\x3d%67mail\x26hl\x3den",,0,"Gmail","Gmail",[["us","c130f0854ca2c2bb",[["n"],["m","New features!"],["u"],["k","0"],["p","1000:500000,10,200000,5,100000,3,75000,2,0,1"],["h","https://survey.googleratings.com/wix/p1679258.aspx?l\x3d1033"],["at","query,5,contacts,5,adv,5,cf,5,default,20"],["v","https://www.youtube.com/embed/Ra8HG6MkOXY?showinfo\x3d0"],
When I do inspect element on the button, the HTML code that I posted above for the button comes up, but not when doing view source. Basically, what I am going to need to do is use some sort of GUI and have the user navigate to the link and then have the program fill out the info. Does anyone know how I can do this? Thanks.
Have a look at the 5 Minute Getting Started Guide for Selenium: http://code.google.com/p/selenium/wiki/GettingStarted
On the login page, look at the form's HTML to see the url it posts to and the url parameters. Then request that url with the same parameters filled in with correct info, and make sure to save all the cookie headers to send to the second page. Then use an html parser to find your link. There are several html parsers available on sourceforge, and you could even try java's built in xml parsers, though if the site has even a tiny html mistake they will glitch.
EDIT didn't notice the fact that it is not a normal link. In that case you will need to look at the site's javascript to see where the link leads. If the link requires javascript to run, it gets more complicated. Java is not able to execute browser javascript, but I found a library called DJ native swing which includes a web browser class that you can add to jframes. It uses your native browser to render, and to run javascript.
This should be possible in Selenium as others have noted.
I have used Selenium to login then crawl a site and discover every permuation of values for every form on the site (30+ forms). These values are later used to fill and submit the form with a specific perumation of values. This site was very JS/jQuery heavy and I used Selenium's built-in support of javascript executor, css selectors, and XPath to accomplish this.
I implemented HtmlUnit and HttpUnit as faster alternatives, but found they were not as reliable as Selenium given the JS semantics of the site I was crawling.
It's hard to give you code on how to accomplish it because your Selenium implementation will be quite page-specific and I can't look at the page you're coding against to figure out what's going on with that button script junk. However, I have include some possibly relevant selenium code (Java) snippets:
Element element = driver.findElements(By.id(value)); //find element on page
List<Element> buttons = parent.findElements(By.xpath("./tr/td/button")); //find child element
button.click();
element.submit() //submit enclosing form
element.sendKeys(text); //enter text in an input
String elementText = (String) ((JavascriptExecutor) driver).executeScript("return arguments[0].innerText || arguments[0].textContent", element); //interact with a selenium element via JS
If you are coding similar functions on different pages, then PageObjects behind interfaces can help.
The link Anew posted is a good starting point and good ol' StackOverflow has answers to just about any Selenium problem ever.
Instead of trying to browse around programmatically, try executing the login request and save the cookies then set those in the next request to the form post.
HTMLUnit is pretty bad at processing JavaScript, the Rhino JS library produces often errors (actually no errors is much the exception). I would advise to use Selenium, which is basically a framework to control headless browsers (chrome, firefox based).
For your question, the following code would do the work
selenium.open(myurl);
selenium.click("id=:tv");
You then have to wait for the page to load
selenium.waitForPageToLoad(someTime);
I would recommend htmlunit any day. It's a great library.
First, check out their web page(http://htmlunit.sourceforge.net/) to get htmlunit up and running. Make sure you use the latest snapshot(2.12 when writing this)
Try these settings to ignore pretty much any obstacle:
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);
webClient.getOptions().setRedirectEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);
Then when fetching your page, make sure you wait for background Javascript before doing anything with the page, like posting a login form:
//Get Page
HtmlPage page1 = webClient.getPage("https://login-url/");
//Wait for background Javascript
webClient.waitForBackgroundJavaScript(10000);
//Get first form on page
HtmlForm form = page1.getForms().get(0);
//Get login input fields using input field name
HtmlTextInput userName = form.getInputByName("UserName");
HtmlPasswordInput password = form.getInputByName("Password");
//Set input values
userName.setValueAttribute("MyUserName");
password.setValueAttribute("MyPassword");
//Find the first button in form using name, id or xpath
HtmlElement button = (HtmlElement) form.getFirstByXPath("//button");
//Post by clicking the button and cast the result, login arrival url, to a new page and repeat what you did with page1 or something else :)
HtmlPage page2 = (HtmlPage) button.click();
//Profit
System.out.println(page2.asXml());
I hope this basic example will help you!

Change the title of the theme page in Liferay 6.1

I have created a theme in liferay 6.1. Now my question is how do I change the title of the theme pages.
For ex: About us page has title "Aboutus -liferay", I want to change it to "Aboutus".
I have tried using javascript for this like:
document.title="aboutus";
But until the page loads it shows the default title(Aboutus-liferay) and then after page load this "aboutus" title appears.
I want the custom title.
Any help is highly appreciated.
I just added:
**<head>
<title>$the_title</title>
</head>**
in my portal_normal.vm file and this solved my problem. Now whatever title i add in my html title of the pages in Manage Pages --> pages gets displayed in the title.
Edit the title inside portal_normal.vm of your theme.
In portal_normal.vm, which is a velocity file, add your title to the following code snippet :
<head>
<title>your_title</title>
</head>
EDIT
If you are talking about JSP pages, you can use:
com.liferay.portal.util.PortalUtil.setPageTitle(String, title, HttpServletRequest request);
in the respective page body.

how to generate link to "Manage Page" in Liferay?

I'm developing simple pages navigation portlet, and for each page I would like to have link to its "Manage Page" ("Manage > Page" in the top navigation bar)
Do you have any ideas how this link can be generated?
Thanks,
Karol
Sorry I needed to add another answer as the comment had less charachters. For each url you have to create pageSettingsURL as under. Write the following logic in a loop for all the layouts of the community you are interested in using LayoutLocalServiceUtil class and pass the plid
PortletURL pageSettingsURL = new PortletURLImpl(
request, PortletKeys.LAYOUT_MANAGEMENT, plid,
PortletRequest.RENDER_PHASE);
pageSettingsURL.setWindowState(WindowState.MAXIMIZED);
pageSettingsURL.setPortletMode(PortletMode.VIEW);
pageSettingsURL.setParameter(
"struts_action", "/layout_management/edit_pages");
if (layout.isPrivateLayout()) {
pageSettingsURL.setParameter("tabs1", "private-pages");
}
else {
pageSettingsURL.setParameter("tabs1", "public-pages");
}
pageSettingsURL.setParameter("redirect", currentURL);
pageSettingsURL.setParameter(
"groupId", String.valueOf(scopeGroupId));
pageSettingsURL.setParameter("selPlid", String.valueOf(plid));
Try
themeDisplay.getURLPageSettings().toString()
You should get themeDisplay in jsp page if you are using
You should get themeDisplay as request attribute in your portlet class

Categories

Resources