Desarrollo

Para iniciar el desarrollo de nuestro buscador interno. Abrimos nuestro eclipse y creamos un proyecto maven.File->New->MavenProject
Login Test
Seleccionamos en Create a simple project y presionamos Next
Login Test
LLenamos los siguientes campos y presionamos Finish: Busca frase
Ahora vemos que tenemos un problema nos vamos a nuestro proyecto y le damos clic derecho donde dice Maven->Update Project..
Login Test
Nos marcara un error que no encuentra el archivo web.xml pero lo solucionaremos de la siguiente manera, hacemos clic derecho en el proyecto y selecionamos Properties
Login Test
Selecionamos Project Facets en el recuadro seleccionamos Dynamic Web Module 3.1 y Java Server Faces 2.2 y presionamos Apply posterriormente OK
Medical Consulting
Creamos una carpeta en src/main/webapp llamada WEB-INF En el directorio WEB-INF creamos el archivo web.xml y escribimos lo siguiente:
 
           
     <?xml version="1.0" encoding="UTF-8"?>
<web-app xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="3.1">
<display-name>buscafrase2</display-name>
<absolute-ordering/>
<!-- load spring configuration -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>saga</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
</web-app>        
                     
     
   

Creamos el archivo faces-config.xml y escribimos lo siguiente:
 
   
  <?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
    version="2.2">

</faces-config> 
     
      
   

Ahora creamos todas las dependencias en nuestro archivo pom.xml queda de la siguiente forma:
 
   
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.tutosoftware.buscafrase2</groupId>
  <artifactId>buscafrase2</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>Busca Frase2</name>
  
  <repositories>
    <repository>
        <id>prime-repo</id>
        <name>PrimeFaces Maven Repository</name>
        <url>http://repository.primefaces.org/</url>
        <layout>default</layout>
    </repository>
</repositories>
  <properties>
        
	    <primefaces.version>13.0.1</primefaces.version>
		<jsf2.version>2.2.10</jsf2.version>
		<jstl.version>1.2</jstl.version>
		<jsp-api.version>2.1</jsp-api.version>
		<servlet-api.version>3.1.0</servlet-api.version>
		<itext.version>2.1.7</itext.version>
		<poi.version>3.17</poi.version>
		<elri.version>1.0</elri.version>
		<javaeewebapi.version>7.0</javaeewebapi.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
  
  <dependencies>
 
 <dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>${primefaces.version}</version>
     </dependency>
     
		
		
		
			
		
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>${jsf2.version}</version>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>${jsf2.version}</version>
		</dependency>
		
			
		
		 <dependency>
				<groupId>javax.servlet.jsp</groupId>
				<artifactId>jsp-api</artifactId>
				<version>${jsp-api.version}</version>
				<scope>provided</scope>
			</dependency>
			
			
         <dependency>
	     <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	   <version>${servlet-api.version}</version>
        </dependency>
			
			
			
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>jstl</artifactId>
				<version>${jstl.version}</version>
			</dependency>
		
     <dependency>
			<groupId>com.sun.el</groupId>
			<artifactId>el-ri</artifactId>
			<version>${elri.version}</version>
		</dependency>
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<version>${javaeewebapi.version}</version>
			<scope>provided</scope>
		</dependency>
 
  
  <dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>${itext.version}</version>
</dependency>
     
   <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>${poi.version}</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.15.3</version>
</dependency>

   <dependency>
      <groupId>javax.ws.rs</groupId>
      <artifactId>javax.ws.rs-api</artifactId>
      <version>2.0</version>
   </dependency>
  
  <dependency>
 <groupId>org.glassfish.jersey.core</groupId>
 <artifactId>jersey-client</artifactId>
 <version>2.12</version>
 </dependency>
 
 <dependency>
 <groupId>org.glassfish.jersey.media</groupId>
 <artifactId>jersey-media-json-jackson</artifactId>
 <version>2.11</version>
 </dependency>
 
 </dependencies>
 
 <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
           <source>1.8</source>
           <target>1.8</target>
        </configuration>
      </plugin> 
    </plugins>
   </build>
  
  
  
  
  
  
</project>
  
  
  
      
   

Aparece un error damos Maven->Update project y se quita.
En src/main/java creamos el paquete com.tutosoftware.buscafrase2.model
En este paquete creamos la clase Busqueda y escribimos:
 
   
  package com.tutosoftware.buscafrase2.model;

public class Busqueda {
	
	private String frase;
	private String link;
	public String getLink() {
		return link;
	}
	public void setLink(String link) {
		this.link = link;
	}
	public String getFrase() {
		return frase;
	}
	public void setFrase(String frase) {
		this.frase = frase;
	}

}
  
  
  
  
  
    
   

Ahora creamos el paquete com.tutosoftware.buscafrase2.view
En este paquete creamos la clase BusquedaView
 
   
  package com.tutosoftware.buscafrase2.view;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.tutosoftware.buscafrase2.model.Busqueda;

@ManagedBean
@ViewScoped
public class BusquedaView implements Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<Busqueda> busquedas = new ArrayList<>();
	private String numFrase;
	private String palabraBusqueda;
	private String baseUrl="";
	private int inicio;
	private int fin;

	public List<Busqueda> getBusquedas() {
		return busquedas;
	}

	public void setBusquedas(List<Busqueda> busquedas) {
		this.busquedas = busquedas;
	}
	
	
	public String getNumFrase() {
		return numFrase;
	}

	public void setNumFrase(String numFrase) {
		this.numFrase = numFrase;
	}

	public String getPalabraBusqueda() {
		return palabraBusqueda;
	}

	public void setPalabraBusqueda(String palabraBusqueda) {
		this.palabraBusqueda = palabraBusqueda;
	}

	public void buscar() throws IOException {
	      
		busquedas.clear();
		
		if(numFrase.equals("frases")) {
			baseUrl="https://tutosoftware.com/tutoriales/frases/";
			inicio=0;
			fin=58;
		}
		
		if(numFrase.equals("frases2")) {
			baseUrl="https://tutosoftware.com/tutoriales/frases2/";
			inicio=1;
			fin=59;
		}
		
		
		if(numFrase.equals("frases3")) {
			baseUrl="https://tutosoftware.com/tutoriales/frases3/";
			inicio=2;
			fin=60;
		}
		
		if(numFrase.equals("frases4")) {
			baseUrl="https://tutosoftware.com/tutoriales/frases4/";
			inicio=3;
			fin=61;
		}
		if(numFrase.equals("frases5")) {
			baseUrl="https://tutosoftware.com/tutoriales/frases5/";
			inicio=4;
			fin=62;
		}
		if(numFrase.equals("frases6")) {
			baseUrl="https://tutosoftware.com/tutoriales/frases6/";
			inicio=5;
			fin=33;
		}
		
		
		Document doc = Jsoup.connect(baseUrl)
				.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36")
				.get();
        
		
		Elements nextElements = doc.select("li");
		
		while (inicio<=fin) {
			
            Element ne =nextElements.get(inicio);
			
			String relativeUrl =ne.getElementsByTag("a").first().attr("href");
			
			String completeUrl = baseUrl + relativeUrl;
			
			doc = Jsoup
                    .connect(completeUrl)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36")
                    .get();
			
			
			Elements h3s = doc.select("h3");
			Elements h1s = doc.select("h1");
			
			for(Element h3:h3s) {
				String texto= h3.select("h3").first().text();
				if(texto.contains(palabraBusqueda)) {
					Busqueda busca=new Busqueda();
					busca.setLink(completeUrl);
					busca.setFrase(texto);
					
					busquedas.add(busca);
					//System.out.println(completeUrl);
					//System.out.println(texto);
				}
			}
				
				
				
				for(Element h1:h1s) {
					String titulo= h1.select("h1").first().text();
					if(titulo.contains(palabraBusqueda)) {
						Busqueda busca=new Busqueda();
						busca.setLink(completeUrl);
						busca.setFrase(titulo);
						//System.out.println(completeUrl);
						//System.out.println(titulo);
						busquedas.add(busca);
					}
						
				}
				
				inicio++;
			}
		}
	
	
	    public void limpiar() {
	    	busquedas.clear();
	    }

}
  
  
  
  
  
    
   

En el directorio src/main/webapp creamos el archivo index.xhtml
 
   
  <html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
    
    <h:head>
    </h:head>

    <h:body>
    
    <div style="margin:0 auto;width:70%">
 
 
 <h1>BuscaFrases</h1>
 
 
 
 
 <h:form>
 
  <p:panel header="Busca tu frase y elige directorio " footer="Tutosoftware">
  
  
  <h:panelGrid columns="4" cellpadding="5">
<h:outputLabel value="Palabra" for="palabraBusqueda"     />
<p:inputText id="palabraBusqueda"   value="#{busquedaView.palabraBusqueda}"  label="Búsqueda">
</p:inputText>
<p:selectOneMenu id="numFrase" value="#{busquedaView.numFrase}">
                   
                    <f:selectItem itemLabel="Frases I" itemValue="frases"/>
                    <f:selectItem itemLabel="Frases II" itemValue="frases2"/>
                    <f:selectItem itemLabel="Frases III" itemValue="frases3"/>
                    <f:selectItem itemLabel="Frases IV" itemValue="frases4"/>
                    <f:selectItem itemLabel="Frases V" itemValue="frases5"/>
                    <f:selectItem itemLabel="Frases VI" itemValue="frases6"/>
                    <f:facet name="footer">
                        <p:divider styleClass="mt-0" />
                        <h:outputText value="6 opciones" style="font-weight:bold;"/>
                    </f:facet>
                </p:selectOneMenu>
        <p:commandButton  value="Buscar" action="#{busquedaView.buscar()}" update="busquedas" >  </p:commandButton>

<f:facet name="footer">


<p:commandButton  value="limpiar" action="#{busquedaView.limpiar()}" update="busquedas" >  </p:commandButton>
</f:facet>

</h:panelGrid>
  
  <p:dataView  id="busquedas"     var="bus" value="#{busquedaView.busquedas}" rows="12" paginator="true"
                    rowsPerPageTemplate="6,12,16"
                    paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                    gridIcon="pi pi-th-large" listIcon="pi pi-bars"
                    >

            <p:dataViewListItem >
                
            
        <a href="#{bus.link}" >#{bus.link}</a>
         <h:outputText value="#{bus.frase}" >
                        
                        </h:outputText>
                
                  
            </p:dataViewListItem>
   </p:dataView>
  
        
   </p:panel>
   
  </h:form>
  
   
 </div>   
 </h:body>
</html>
   
  
  
  
     
   

Probando