├── system.properties ├── src ├── main │ ├── resources │ │ ├── static │ │ │ ├── index.css │ │ │ ├── introduction │ │ │ │ ├── helloworld.js │ │ │ │ └── helloworld.html │ │ │ ├── eksamen │ │ │ │ ├── v19 │ │ │ │ │ └── index.html │ │ │ │ └── v20 │ │ │ │ │ ├── logginn.html │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index.html │ │ │ │ │ └── logginn.js │ │ │ ├── klientTjener1 │ │ │ │ ├── helloserver.js │ │ │ │ ├── load.html │ │ │ │ ├── load.js │ │ │ │ ├── helloserver.html │ │ │ │ ├── temperatur.html │ │ │ │ ├── temperatur.js │ │ │ │ ├── kalkulator.html │ │ │ │ ├── index.js │ │ │ │ ├── index.html │ │ │ │ └── kalkulator.js │ │ │ ├── javascript2 │ │ │ │ ├── plenum.html │ │ │ │ ├── js2.html │ │ │ │ └── js2.js │ │ │ ├── jQuery │ │ │ │ ├── oving.html │ │ │ │ ├── oving.js │ │ │ │ └── jquery.html │ │ │ ├── javascript3 │ │ │ │ ├── oving.html │ │ │ │ ├── oving.js │ │ │ │ └── js3.html │ │ │ ├── apiurl.js │ │ │ ├── rekursjon │ │ │ │ ├── towerofhanoi.js │ │ │ │ └── towerofhanoi.html │ │ │ ├── inputvalidering │ │ │ │ ├── index.html │ │ │ │ ├── index.js │ │ │ │ ├── registrere.html │ │ │ │ ├── validering.js │ │ │ │ ├── registrere.js │ │ │ │ ├── endre.html │ │ │ │ └── endre.js │ │ │ ├── sesjoner │ │ │ │ ├── index.js │ │ │ │ ├── liste.html │ │ │ │ ├── index.html │ │ │ │ ├── liste.js │ │ │ │ ├── registrere.html │ │ │ │ ├── endre.html │ │ │ │ ├── registrere.js │ │ │ │ ├── validering.js │ │ │ │ └── endre.js │ │ │ ├── sikkerhet │ │ │ │ ├── liste.html │ │ │ │ ├── nybruker.js │ │ │ │ ├── nybruker.html │ │ │ │ ├── index.js │ │ │ │ ├── index.html │ │ │ │ ├── liste.js │ │ │ │ ├── registrere.html │ │ │ │ ├── endre.html │ │ │ │ ├── registrere.js │ │ │ │ ├── validering.js │ │ │ │ └── endre.js │ │ │ ├── relasjonsdatabase2 │ │ │ │ ├── index.html │ │ │ │ ├── registrere.html │ │ │ │ ├── endre.html │ │ │ │ ├── registrere.js │ │ │ │ ├── index.js │ │ │ │ └── endre.js │ │ │ ├── javascript1 │ │ │ │ ├── js1.js │ │ │ │ └── js1.html │ │ │ ├── lagringserver │ │ │ │ ├── index.html │ │ │ │ └── index.js │ │ │ ├── index.html │ │ │ ├── stylingbootstrap │ │ │ │ ├── index.html │ │ │ │ └── index.js │ │ │ ├── relasjonsdatabase1 │ │ │ │ └── index.html │ │ │ └── nedtrekkslister │ │ │ │ └── index.html │ │ ├── application.properties │ │ ├── templates │ │ │ └── error.html │ │ └── schema.sql │ └── java │ │ └── eriksommer │ │ └── webprog │ │ ├── eksamen │ │ ├── v19 │ │ │ └── Main.java │ │ └── v20 │ │ │ ├── Bruker.java │ │ │ ├── Skiloper.java │ │ │ └── ControllerV20.java │ │ ├── generiskedatatyper │ │ ├── MobelButikken.java │ │ ├── MobelComparator.java │ │ ├── MobelImpl.java │ │ ├── Stol.java │ │ ├── BordComparator.java │ │ ├── Bord.java │ │ ├── MobelRegister.java │ │ └── Mobel.java │ │ ├── klientTjener1 │ │ ├── controller │ │ │ ├── HelloServerController.java │ │ │ ├── TempController.java │ │ │ ├── ValutaController.java │ │ │ └── KalkulatorController.java │ │ ├── model │ │ │ ├── Valuta.java │ │ │ └── Belop.java │ │ └── service │ │ │ ├── KalkulatorService.java │ │ │ ├── TempService.java │ │ │ └── ValutaService.java │ │ ├── WebprogApplication.java │ │ ├── ErrorHandler.java │ │ ├── nedtrekkslister │ │ ├── model │ │ │ ├── Bil.java │ │ │ └── Motorvogn.java │ │ ├── repository │ │ │ ├── MotorvognRepository.java │ │ │ └── BilRepository.java │ │ └── controller │ │ │ ├── BilController.java │ │ │ └── MotorvognController.java │ │ ├── sesjoner │ │ ├── model │ │ │ ├── Bil.java │ │ │ └── Motorvogn.java │ │ └── service │ │ │ └── Inputvalidering.java │ │ ├── sikkerhet │ │ ├── model │ │ │ ├── Bil.java │ │ │ ├── Bruker.java │ │ │ └── Motorvogn.java │ │ └── service │ │ │ ├── Kryptering.java │ │ │ └── Inputvalidering.java │ │ ├── inputvalidering │ │ ├── model │ │ │ ├── Bil.java │ │ │ └── Motorvogn.java │ │ ├── service │ │ │ └── Inputvalidering.java │ │ └── repository │ │ │ └── Motorvogn7Repository.java │ │ ├── relasjonsdatabase1 │ │ ├── model │ │ │ ├── Bil.java │ │ │ └── Motorvogn.java │ │ ├── controller │ │ │ └── Motorvogn4Controller.java │ │ └── repository │ │ │ └── Motorvogn4Repository.java │ │ ├── lagringserver │ │ ├── repository │ │ │ └── AppRepository.java │ │ ├── controller │ │ │ └── Controller.java │ │ └── model │ │ │ └── Motorvogn.java │ │ ├── relasjonsdatabase2 │ │ ├── model │ │ │ ├── Bil.java │ │ │ └── Motorvogn.java │ │ ├── controller │ │ │ └── Motorvogn6Controller.java │ │ └── repository │ │ │ └── Motorvogn6Repository.java │ │ ├── rekursjon │ │ ├── service │ │ │ └── TowerOfHanoiService.java │ │ ├── controller │ │ │ └── TowerOfHanoiController.java │ │ ├── model │ │ │ └── TowerOfHanoi.java │ │ └── Rekursjon.java │ │ ├── datastrukturer │ │ ├── Stakk.java │ │ ├── SirkelLinketListe.java │ │ └── LenketListe.java │ │ └── ovinger │ │ ├── Sorting.java │ │ └── Liste.java └── test │ └── java │ └── eriksommer │ └── webprog │ ├── WebprogApplicationTests.java │ ├── datastrukturer │ ├── StakkTest.java │ └── SirkelLinketListeTest.java │ ├── ovinger │ └── ListeTest.java │ └── rekursjon │ └── RekursjonTest.java ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── .gitignore ├── README.md └── pom.xml /system.properties: -------------------------------------------------------------------------------- 1 | java.runtime.version=17 -------------------------------------------------------------------------------- /src/main/resources/static/index.css: -------------------------------------------------------------------------------- 1 | ol.number { 2 | list-style-type: lower-number; 3 | } -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/erikssommer/web-programming-spring/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/eksamen/v19/Main.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.eksamen.v19; 2 | 3 | public class Main { 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/static/introduction/helloworld.js: -------------------------------------------------------------------------------- 1 | function visMelding(navn) { 2 | document.write("Hallo verden for: " + navn); 3 | } -------------------------------------------------------------------------------- /src/main/resources/static/eksamen/v19/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/helloserver.js: -------------------------------------------------------------------------------- 1 | $(() => { 2 | $("#call").click(() => { 3 | const url = "/helloserver?name=" + $("#name").val(); 4 | 5 | $.get(url, data => $("#hello").html(data)); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar 3 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.url=jdbc:h2:mem:testdb 2 | spring.h2.console.enabled=true 3 | spring.h2.console.path=/hemmelig-h2-console 4 | spring.h2.console.settings.web-allow-others=true 5 | spring.jpa.open-in-view=true 6 | server.error.whitelabel.enabled=false -------------------------------------------------------------------------------- /src/main/resources/static/introduction/helloworld.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HelloWorld 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/test/java/eriksommer/webprog/WebprogApplicationTests.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class WebprogApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/resources/static/javascript2/plenum.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Gjennomgang av ukesoppgaver JavaScript2 6 | 7 | 8 | 9 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/generiskedatatyper/MobelButikken.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.generiskedatatyper; 2 | 3 | import java.util.List; 4 | 5 | public class MobelButikken { 6 | // oppgave 5 7 | public static void generiskSkrivUtAlle(List mobler) { 8 | for (T mobel : mobler) { 9 | System.out.println(mobel); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/generiskedatatyper/MobelComparator.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.generiskedatatyper; 2 | 3 | import java.util.Comparator; 4 | 5 | public class MobelComparator implements Comparator { 6 | 7 | @Override 8 | public int compare(Mobel o1, Mobel o2) { 9 | 10 | return ((Mobel) o1).getNavn().compareTo(((Mobel) o2).getNavn()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/resources/static/javascript2/js2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Ukesoppgaver javascript 2 6 | 7 | 8 | 9 | 10 |

Foreløpig bare output i console. Bruk chrome og inspiser

11 | 12 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/generiskedatatyper/MobelImpl.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.generiskedatatyper; 2 | 3 | public class MobelImpl extends Mobel { 4 | 5 | public MobelImpl(String navn, String type, int vekt, int pris, int nummer) { 6 | super(navn, type, vekt, pris, nummer); 7 | } 8 | 9 | public String toString() { 10 | return getNummer() + "_" + getNavn(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/generiskedatatyper/Stol.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.generiskedatatyper; 2 | 3 | public class Stol extends Mobel { 4 | 5 | public Stol(String navn, String type, int vekt, int pris, int nummer) { 6 | super(navn, type, vekt, pris, nummer); 7 | } 8 | 9 | @Override 10 | public String toString() { 11 | return getNummer() + "_" + getNavn(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/generiskedatatyper/BordComparator.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.generiskedatatyper; 2 | 3 | import java.util.Comparator; 4 | 5 | public class BordComparator implements Comparator { 6 | 7 | @Override 8 | public int compare(Mobel o1, Mobel o2) { 9 | Bord m1 = (Bord) o1; 10 | Bord m2 = (Bord) o2; 11 | 12 | return m1.getBen() - m2.getBen(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/load.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Load 6 | 7 | 8 | 9 | 10 |

Last valutaregister på server

11 | 12 |

Tilbake til index

13 | 14 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/load.js: -------------------------------------------------------------------------------- 1 | import { apiKlinetTjener1 as api} from "../apiurl.js" 2 | 3 | $(() => { 4 | $("#last").click(() => { 5 | $.post(api + "/load", (data, status) => { 6 | console.log(status) 7 | if (status === "success") { 8 | alert("Valutaene er lastet"); 9 | } else { 10 | alert("Noe gikk galt, se consollen") 11 | } 12 | }); 13 | }); 14 | }); -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/controller/HelloServerController.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.controller; 2 | 3 | import org.springframework.web.bind.annotation.GetMapping; 4 | import org.springframework.web.bind.annotation.RestController; 5 | 6 | @RestController 7 | public class HelloServerController { 8 | 9 | @GetMapping("/helloserver") 10 | public String hello(String name) { 11 | return "Hallo fra " + name; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/resources/static/jQuery/oving.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Øving 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/helloserver.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 |

Første webprogram

11 | Skriv inn navnet : 12 | 13 |
14 |
15 | 16 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/temperatur.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Finn temperatur 6 | 7 | 8 | 9 | 10 |

Finn gjennomsnitts temp i Oslo i gitt måned

11 | Skriv inn måned: 12 | 13 |

14 | 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /src/main/resources/static/javascript3/oving.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Øving 6 | 7 | 8 | 9 |
10 | Input: 11 |
12 |
13 |
14 | Navnobjekt: 15 |
16 |
17 | 18 | 19 |

20 | 21 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/WebprogApplication.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; 6 | 7 | @SpringBootApplication(exclude={SecurityAutoConfiguration.class}) 8 | public class WebprogApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(WebprogApplication.class, args); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/temperatur.js: -------------------------------------------------------------------------------- 1 | import { apiKlinetTjener1 as api} from "../apiurl.js" 2 | 3 | $(() => { 4 | $("#beregn").click(() => { 5 | const maned = $("#maned").val(); 6 | 7 | $.get(api + "/hentTemp?mnd=" + maned, temp => { 8 | if (temp !== 0) { 9 | $("#melding").html("Det var en gjennomsnittstemperatur " + 10 | " på " + temp + " grader i " + maned); 11 | } else { 12 | $("#melding").html("Du har oppgitt ugyldig månedsnavn"); 13 | } 14 | }); 15 | }); 16 | }); -------------------------------------------------------------------------------- /src/test/java/eriksommer/webprog/datastrukturer/StakkTest.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.datastrukturer; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.junit.jupiter.api.Assertions.*; 6 | 7 | class StakkTest { 8 | 9 | @Test 10 | void stack() { 11 | Stakk stakk = new Stakk(); 12 | 13 | stakk.push(8); 14 | stakk.push(7); 15 | stakk.push(3); 16 | 17 | stakk.skrivUt(); 18 | 19 | System.out.println(); 20 | 21 | System.out.println(stakk.peek()); 22 | 23 | stakk.pop(); 24 | 25 | stakk.skrivUt(); 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/ErrorHandler.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog; 2 | 3 | import org.springframework.boot.web.servlet.error.ErrorController; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | 7 | @Controller 8 | public class ErrorHandler implements ErrorController { 9 | 10 | private static final String PATH = "/error"; 11 | 12 | @RequestMapping(value = PATH) 13 | public String error(){ 14 | return "error"; 15 | } 16 | 17 | public String getErrorPath() { 18 | return PATH; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/resources/static/eksamen/v20/logginn.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 |

Logg inn

9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
E-post
Passord
22 |
23 |
24 | 25 | -------------------------------------------------------------------------------- /src/main/resources/static/apiurl.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Samling av api-konstanter 3 | * @type {string} 4 | */ 5 | 6 | export const apiKlinetTjener1 = "/api/klienttjener1"; 7 | export const apiLagringServer = "/api/lagringserver"; 8 | export const apiNedtrekkslister = "/api/nedtrekkslister"; 9 | export const apiRekursjon = "/api/rekursjon"; 10 | export const apiRelasjonsdatabase1 = "/api/relasjonsdatabase1"; 11 | export const apiRelasjonsdatabase2 = "/api/relasjonsdatabase2"; 12 | export const apiInputvalidering = "/api/inputvalidering"; 13 | export const apiSesjoner = "/api/sesjoner"; 14 | export const apiSikkerhet = "/api/sikkerhet"; -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/generiskedatatyper/Bord.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.generiskedatatyper; 2 | 3 | public class Bord extends Mobel { 4 | 5 | private int ben; 6 | 7 | public Bord(String navn, String type, int vekt, int pris, int nummer, int ben) { 8 | super(navn, type, vekt, pris, nummer); 9 | this.ben = ben; 10 | } 11 | 12 | public int getBen() { 13 | return ben; 14 | } 15 | 16 | public void setBen(int ben) { 17 | this.ben = ben; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return getNummer() + "_" + getNavn() + "_" + getBen(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/model/Valuta.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.model; 2 | 3 | public class Valuta { 4 | private String sort; 5 | private double kurs; 6 | 7 | public Valuta(String sort, double kurs) { 8 | this.sort = sort; 9 | this.kurs = kurs; 10 | } 11 | 12 | public String getSort() { 13 | return sort; 14 | } 15 | 16 | public void setSort(String sort) { 17 | this.sort = sort; 18 | } 19 | 20 | public double getKurs() { 21 | return kurs; 22 | } 23 | 24 | public void setKurs(double kurs) { 25 | this.kurs = kurs; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/nedtrekkslister/model/Bil.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.nedtrekkslister.model; 2 | 3 | public class Bil { 4 | private String merke; 5 | private String type; 6 | 7 | public Bil(String merke, String type) { 8 | this.merke = merke; 9 | this.type = type; 10 | } 11 | 12 | public String getMerke() { 13 | return merke; 14 | } 15 | 16 | public void setMerke(String merke) { 17 | this.merke = merke; 18 | } 19 | 20 | public String getType() { 21 | return type; 22 | } 23 | 24 | public void setType(String type) { 25 | this.type = type; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/model/Belop.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.model; 2 | 3 | public class Belop { 4 | private String sort; 5 | private double verdi; 6 | 7 | public Belop(String sort, double verdi) { 8 | this.sort = sort; 9 | this.verdi = verdi; 10 | } 11 | 12 | public String getSort() { 13 | return sort; 14 | } 15 | 16 | public void setSort(String sort) { 17 | this.sort = sort; 18 | } 19 | 20 | public double getVerdi() { 21 | return verdi; 22 | } 23 | 24 | public void setVerdi(double verdi) { 25 | this.verdi = verdi; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/sesjoner/model/Bil.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.sesjoner.model; 2 | 3 | public class Bil { 4 | private String merke; 5 | private String type; 6 | 7 | public Bil(String merke, String type) { 8 | this.merke = merke; 9 | this.type = type; 10 | } 11 | 12 | public Bil() { 13 | } 14 | 15 | public String getMerke() { 16 | return merke; 17 | } 18 | 19 | public void setMerke(String merke) { 20 | this.merke = merke; 21 | } 22 | 23 | public String getType() { 24 | return type; 25 | } 26 | 27 | public void setType(String type) { 28 | this.type = type; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/sikkerhet/model/Bil.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.sikkerhet.model; 2 | 3 | public class Bil { 4 | private String merke; 5 | private String type; 6 | 7 | public Bil(String merke, String type) { 8 | this.merke = merke; 9 | this.type = type; 10 | } 11 | 12 | public Bil() { 13 | } 14 | 15 | public String getMerke() { 16 | return merke; 17 | } 18 | 19 | public void setMerke(String merke) { 20 | this.merke = merke; 21 | } 22 | 23 | public String getType() { 24 | return type; 25 | } 26 | 27 | public void setType(String type) { 28 | this.type = type; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/resources/static/rekursjon/towerofhanoi.js: -------------------------------------------------------------------------------- 1 | import { apiRekursjon as api} from "../apiurl.js" 2 | 3 | $(() => { 4 | $("#solveTower").click(() => { 5 | const tower = { 6 | rings: $("#rings").val(), 7 | fromRod: $("#fromRod").val(), 8 | toRod: $("#toRod").val(), 9 | tmpRod: $("#tmpRod").val() 10 | }; 11 | 12 | $.post(api + "/hanoi", tower, () => $.get(api + "/hanoi", solution => format(solution))); 13 | }); 14 | }); 15 | 16 | const format = (solution) => { 17 | let msg = "

Flytt

"; 18 | for (let line of solution) { 19 | msg += line + "
"; 20 | } 21 | $("#solution").html(msg); 22 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/inputvalidering/model/Bil.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.inputvalidering.model; 2 | 3 | public class Bil { 4 | private String merke; 5 | private String type; 6 | 7 | public Bil(String merke, String type) { 8 | this.merke = merke; 9 | this.type = type; 10 | } 11 | 12 | public Bil() { 13 | } 14 | 15 | public String getMerke() { 16 | return merke; 17 | } 18 | 19 | public void setMerke(String merke) { 20 | this.merke = merke; 21 | } 22 | 23 | public String getType() { 24 | return type; 25 | } 26 | 27 | public void setType(String type) { 28 | this.type = type; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/relasjonsdatabase1/model/Bil.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.relasjonsdatabase1.model; 2 | 3 | public class Bil { 4 | private String merke; 5 | private String type; 6 | 7 | public Bil(String merke, String type) { 8 | this.merke = merke; 9 | this.type = type; 10 | } 11 | 12 | public Bil() {} 13 | 14 | public String getMerke() { 15 | return merke; 16 | } 17 | 18 | public void setMerke(String merke) { 19 | this.merke = merke; 20 | } 21 | 22 | public String getType() { 23 | return type; 24 | } 25 | 26 | public void setType(String type) { 27 | this.type = type; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/kalkulator.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 |

Oppgave 3

11 |
Tall 1:
12 |
13 |
Tall 2:
14 |
15 | 16 | 17 | 18 | 19 |
20 | 21 | -------------------------------------------------------------------------------- /src/main/resources/static/jQuery/oving.js: -------------------------------------------------------------------------------- 1 | const liste = []; 2 | 3 | $(function () { 4 | $("#knapp").click(function () { 5 | $("#melding").html("

Hallo " + $("#inn").val() + "

"); 6 | }); 7 | 8 | $("#inn").change(function () { 9 | $("#navn").text($("#inn").val()); 10 | }) 11 | 12 | $("#beregn").click(function () { 13 | liste.push(lagObjekt("Erik", 22, "Male")); 14 | 15 | for (let person of liste) { 16 | console.log(person.navn + " " + person.alder + " " + person.kjonn); 17 | } 18 | }) 19 | }); 20 | 21 | function lagObjekt(navn, alder, kjonn) { 22 | return { 23 | navn, 24 | alder, 25 | kjonn 26 | }; 27 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/eksamen/v20/Bruker.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.eksamen.v20; 2 | 3 | public class Bruker { 4 | private String epost; 5 | private String passord; 6 | 7 | public Bruker(String epost, String passord) { 8 | this.epost = epost; 9 | this.passord = passord; 10 | } 11 | 12 | public Bruker(){} 13 | 14 | public String getEpost() { 15 | return epost; 16 | } 17 | 18 | public void setEpost(String epost) { 19 | this.epost = epost; 20 | } 21 | 22 | public String getPassord() { 23 | return passord; 24 | } 25 | 26 | public void setPassord(String passord) { 27 | this.passord = passord; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/lagringserver/repository/AppRepository.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.lagringserver.repository; 2 | 3 | import eriksommer.webprog.lagringserver.model.Motorvogn; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.ArrayList; 7 | 8 | @Repository 9 | public class AppRepository { 10 | private final ArrayList motorvognliste = new ArrayList<>(); 11 | 12 | public void leggInn(Motorvogn motorvogn) { 13 | motorvognliste.add(motorvogn); 14 | } 15 | 16 | public ArrayList hentAlle() { 17 | return motorvognliste; 18 | } 19 | 20 | public void slettAlle() { 21 | motorvognliste.clear(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/relasjonsdatabase2/model/Bil.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.relasjonsdatabase2.model; 2 | 3 | public class Bil { 4 | private String merke; 5 | private String type; 6 | 7 | public Bil(String merke, String type) { 8 | this.merke = merke; 9 | this.type = type; 10 | } 11 | 12 | public Bil() { 13 | } 14 | 15 | public String getMerke() { 16 | return merke; 17 | } 18 | 19 | public void setMerke(String merke) { 20 | this.merke = merke; 21 | } 22 | 23 | public String getType() { 24 | return type; 25 | } 26 | 27 | public void setType(String type) { 28 | this.type = type; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/sikkerhet/service/Kryptering.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.sikkerhet.service; 2 | 3 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 4 | import org.springframework.stereotype.Service; 5 | 6 | @Service 7 | public class Kryptering { 8 | 9 | private final BCryptPasswordEncoder bCrypt; 10 | 11 | public Kryptering(){ 12 | bCrypt = new BCryptPasswordEncoder(15); 13 | } 14 | 15 | public String krypterPassord(String passord) { 16 | return bCrypt.encode(passord); 17 | } 18 | 19 | public boolean sjekkPassord(String passord, String hashPassord) { 20 | 21 | return bCrypt.matches(passord, hashPassord); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/index.js: -------------------------------------------------------------------------------- 1 | import { apiKlinetTjener1 as api} from "../apiurl.js" 2 | 3 | $(() => { 4 | $("#hentBelop").click(() => { 5 | const sort = $("#sort").val(); 6 | const verdi = $("#verdi").val(); 7 | 8 | const belop = { 9 | sort: sort, 10 | verdi: verdi 11 | } 12 | 13 | $.get(api + "/beregnKurs", belop, nok => { 14 | if (nok !== 0.0) { 15 | const melding = verdi + " i " + sort + " blir: " + nok + "kr"; 16 | $("#valuta").html(melding); 17 | } else { 18 | $("#valuta").html("Du skrev inn ugyldig valutasort"); 19 | } 20 | }); 21 | }); 22 | }); -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/nedtrekkslister/repository/MotorvognRepository.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.nedtrekkslister.repository; 2 | 3 | import eriksommer.webprog.nedtrekkslister.model.Motorvogn; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.ArrayList; 7 | 8 | @Repository 9 | public class MotorvognRepository { 10 | private final ArrayList motorvognliste = new ArrayList<>(); 11 | 12 | public void leggInn(Motorvogn motorvogn) { 13 | motorvognliste.add(motorvogn); 14 | } 15 | 16 | public ArrayList hentAlle() { 17 | return motorvognliste; 18 | } 19 | 20 | public void slettAlle() { 21 | motorvognliste.clear(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/resources/static/eksamen/v20/index.js: -------------------------------------------------------------------------------- 1 | $(() => { 2 | $("#registrer").click(() => { 3 | const skiloper = { 4 | fornavn: $("#fornavn").val(), 5 | etternavn: $("#etternavn").val(), 6 | klubb: $("#klubb").val(), 7 | epost: $("#e-post").val(), 8 | passord: $("#passord").val() 9 | } 10 | 11 | $.post("/api/eksamen/v20/langrenn", skiloper, OK => { 12 | if (OK) { 13 | skrivUt(); 14 | } else { 15 | $("#feil").html("Feil i insetting i database") 16 | } 17 | }) 18 | }) 19 | }) 20 | 21 | const skrivUt = () => { 22 | // Kalle på databasen for aa få tak i data lagret og formatere det ut. 23 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/controller/TempController.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.controller; 2 | 3 | import eriksommer.webprog.klientTjener1.service.TempService; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | @RestController 10 | @RequestMapping("/api/klienttjener1") 11 | public class TempController { 12 | 13 | @Autowired 14 | TempService service; 15 | 16 | @GetMapping("/hentTemp") 17 | public int calculate(String mnd) { 18 | return service.getTemp(mnd); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/test/java/eriksommer/webprog/ovinger/ListeTest.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.ovinger; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.junit.jupiter.api.Assertions.*; 6 | 7 | class ListeTest { 8 | 9 | @Test 10 | void listetest() { 11 | Liste liste = new Liste(); 12 | 13 | liste.settInn(3); 14 | liste.settInn(2); 15 | liste.settInn(10); 16 | 17 | System.out.println(liste.finn(2)); 18 | 19 | liste.skrivUt(); 20 | System.out.println(); 21 | System.out.println("Antall noder er: " + liste.antall()); 22 | 23 | liste.slettNode(2); 24 | 25 | liste.skrivUt(); 26 | System.out.println(); 27 | System.out.println("Antall noder er: " + liste.antall()); 28 | } 29 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/service/KalkulatorService.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | @Service 6 | public class KalkulatorService { 7 | 8 | public double addere(double tall1, double tall2) throws Exception { // Usikker på hvilket avvik som kastes -> safe 9 | return tall1 + tall2; 10 | } 11 | 12 | public double subtrahere(double tall1, double tall2) throws Exception { 13 | return tall1 - tall2; 14 | } 15 | 16 | public double multiplisere(double tall1, double tall2) throws Exception { 17 | return tall1 * tall2; 18 | } 19 | 20 | public double dividere(double tall1, double tall2) throws Exception { 21 | return tall1 / tall2; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Index 6 | 7 | 8 | 9 | 10 |

Beregn norske kroner

11 |

Last valutaer

12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
Valutasort (SEK, USD, EUR)
Verdi
22 | 23 |
24 | 25 | -------------------------------------------------------------------------------- /src/main/resources/static/rekursjon/towerofhanoi.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Tårnet i Hanoi 6 | 7 | 8 | 9 | 10 |

Legg inn info om tårnet

11 | Skriv inn antall ringer :
12 | Skriv inn startstav :
13 | Skriv inn sluttstav :
14 | Skriv inn midlertidig stav :
15 | 16 |

17 |
18 | 19 | -------------------------------------------------------------------------------- /src/test/java/eriksommer/webprog/datastrukturer/SirkelLinketListeTest.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.datastrukturer; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.junit.jupiter.api.Assertions.*; 6 | 7 | class SirkelLinketListeTest { 8 | 9 | @Test 10 | void sirkelLinketListe() { 11 | SirkelLinketListe liste = new SirkelLinketListe(); 12 | 13 | liste.leggTilNode(8); 14 | liste.leggTilNode(7); 15 | liste.leggTilNode(4); 16 | liste.leggTilNode(5); 17 | liste.leggTilNode(3); 18 | 19 | liste.skrivUt(); 20 | 21 | System.out.println(); 22 | 23 | System.out.println(liste.inneholderNode(7)); 24 | 25 | liste.slettNode(7); 26 | 27 | System.out.println(liste.inneholderNode(7)); 28 | 29 | liste.skrivUt(); 30 | 31 | System.out.println(); 32 | } 33 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/nedtrekkslister/controller/BilController.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.nedtrekkslister.controller; 2 | 3 | import eriksommer.webprog.nedtrekkslister.model.Bil; 4 | import eriksommer.webprog.nedtrekkslister.repository.BilRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | import java.util.ArrayList; 9 | 10 | @RestController 11 | @RequestMapping("/api/nedtrekkslister/") 12 | public class BilController { 13 | @Autowired 14 | BilRepository repo; 15 | 16 | @PostMapping("/bil") 17 | public void lagre(Bil motorvogn) { 18 | repo.leggInn(motorvogn); 19 | } 20 | 21 | @GetMapping("/bil") 22 | public ArrayList hent() { 23 | return repo.hentAlle(); 24 | } 25 | 26 | @DeleteMapping("/bil") 27 | public void slett() { 28 | repo.slettAlle(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/lagringserver/controller/Controller.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.lagringserver.controller; 2 | 3 | import eriksommer.webprog.lagringserver.model.Motorvogn; 4 | import eriksommer.webprog.lagringserver.repository.AppRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | import java.util.ArrayList; 9 | 10 | @RestController 11 | @RequestMapping("/api/lagringserver/") 12 | public class Controller { 13 | 14 | @Autowired 15 | AppRepository repo; 16 | 17 | @PostMapping("/motor") 18 | public void lagre(Motorvogn motorvogn) { 19 | repo.leggInn(motorvogn); 20 | } 21 | 22 | @GetMapping("/motor") 23 | public ArrayList hent() { 24 | return repo.hentAlle(); 25 | } 26 | 27 | @DeleteMapping("/motor") 28 | public void slett() { 29 | repo.slettAlle(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/resources/static/inputvalidering/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Alle bilene:

15 |
16 | Registrere 17 | 18 |
19 |
20 |
21 |

22 | Har innført en ID på Motorvognregisterert som er primærnøkkel isteden for personnr! 23 |
24 | 25 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/nedtrekkslister/controller/MotorvognController.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.nedtrekkslister.controller; 2 | 3 | import eriksommer.webprog.nedtrekkslister.model.Motorvogn; 4 | import eriksommer.webprog.nedtrekkslister.repository.MotorvognRepository; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | import java.util.ArrayList; 9 | 10 | @RestController 11 | @RequestMapping("/api/nedtrekkslister/") 12 | public class MotorvognController { 13 | 14 | @Autowired 15 | MotorvognRepository repo; 16 | 17 | @PostMapping("/motor") 18 | public void lagre(Motorvogn motorvogn) { 19 | repo.leggInn(motorvogn); 20 | } 21 | 22 | @GetMapping("/motor") 23 | public ArrayList hent() { 24 | return repo.hentAlle(); 25 | } 26 | 27 | @DeleteMapping("/motor") 28 | public void slett() { 29 | repo.slettAlle(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/rekursjon/service/TowerOfHanoiService.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.rekursjon.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | import java.util.ArrayList; 6 | 7 | @Service 8 | public class TowerOfHanoiService { 9 | 10 | private final ArrayList solution = new ArrayList<>(); 11 | 12 | public ArrayList getSolution() { 13 | return solution; 14 | } 15 | 16 | public void solvTowerOfHanoi(int rings, int fromRod, int toRod, int tmpRod) { 17 | if (rings == 1) { 18 | System.out.println(fromRod + " --> " + toRod); 19 | solution.add(fromRod + " --> " + toRod); 20 | return; 21 | } 22 | 23 | solvTowerOfHanoi(rings - 1, fromRod, tmpRod, toRod); 24 | System.out.println(fromRod + " --> " + toRod); 25 | solution.add(fromRod + " --> " + toRod); 26 | solvTowerOfHanoi(rings - 1, tmpRod, toRod, fromRod); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/index.js: -------------------------------------------------------------------------------- 1 | import {apiSesjoner as api} from "../apiurl.js" 2 | import validering from "./validering.js" 3 | 4 | $(() => { 5 | $("#loggInn").click(() => { 6 | if (validering.loginn()) { 7 | const url = "/loggInn?brukernavn=" + $("#brukernavn").val() + "&passord=" + $("#passord").val(); 8 | $.get(api + url, OK => { 9 | if (OK) { 10 | window.location.href = "/sesjoner/liste.html"; 11 | } else { 12 | $("#feil").html("Feil i brukernavn eller passord"); 13 | } 14 | }) 15 | .fail(jqXHR => { 16 | const json = $.parseJSON(jqXHR.responseText); 17 | $("#feil").html(json.message); 18 | }); 19 | } 20 | }); 21 | 22 | $("#brukernavn").on("change", () => validering.brukernavn()); 23 | $("#passord").on("change", () => validering.passord()); 24 | }); 25 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/sikkerhet/model/Bruker.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.sikkerhet.model; 2 | 3 | public class Bruker { 4 | private int id; 5 | private String brukernavn; 6 | private String passord; 7 | 8 | public Bruker(int id, String brukernavn, String passord) { 9 | this.id = id; 10 | this.brukernavn = brukernavn; 11 | this.passord = passord; 12 | } 13 | 14 | public Bruker() { 15 | } 16 | 17 | public int getId() { 18 | return id; 19 | } 20 | 21 | public void setId(int id) { 22 | this.id = id; 23 | } 24 | 25 | public String getBrukernavn() { 26 | return brukernavn; 27 | } 28 | 29 | public void setBrukernavn(String brukernavn) { 30 | this.brukernavn = brukernavn; 31 | } 32 | 33 | public String getPassord() { 34 | return passord; 35 | } 36 | 37 | public void setPassord(String passord) { 38 | this.passord = passord; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/liste.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Alle bilene:

15 |
16 | Registrere 17 | 18 | 19 |
20 |
21 |
22 |
23 | 24 | -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/liste.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Alle bilene:

15 |
16 | Registrere 17 | 18 | 19 |
20 |
21 |
22 |
23 | 24 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/controller/ValutaController.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.controller; 2 | 3 | import eriksommer.webprog.klientTjener1.model.Belop; 4 | import eriksommer.webprog.klientTjener1.service.ValutaService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | @RestController 12 | @RequestMapping("/api/klienttjener1/") 13 | public class ValutaController { 14 | 15 | @Autowired 16 | ValutaService valutaService; 17 | 18 | @PostMapping("/load") 19 | public void load(){ 20 | valutaService.loadData(); 21 | } 22 | 23 | @GetMapping("/beregnKurs") 24 | public double calculate(Belop belop){ 25 | return valutaService.beregn(belop); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/service/TempService.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.service; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | @Service 6 | public class TempService { 7 | 8 | private final Integer[] tempArray = new Integer[]{-3,-2,2,7,12,16,18,17,12,7,3,-2}; 9 | 10 | public int getTemp(String mnd){ 11 | return switch (mnd) { 12 | case "Januar" -> tempArray[0]; 13 | case "Februar" -> tempArray[1]; 14 | case "Mars" -> tempArray[2]; 15 | case "April" -> tempArray[3]; 16 | case "Mai" -> tempArray[4]; 17 | case "Juni" -> tempArray[5]; 18 | case "Juli" -> tempArray[6]; 19 | case "August" -> tempArray[7]; 20 | case "September" -> tempArray[8]; 21 | case "Oktober" -> tempArray[9]; 22 | case "November" -> tempArray[10]; 23 | case "Desember" -> tempArray[11]; 24 | default -> 0; 25 | }; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/resources/static/relasjonsdatabase2/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Alle bilene:

15 |
16 | Registrere 17 | 18 |
19 |
20 |
21 |

22 | Har innført en ID på Motorvognregisterert som er primærnøkkel isteden for personnr! 23 |
24 | 25 | -------------------------------------------------------------------------------- /src/test/java/eriksommer/webprog/rekursjon/RekursjonTest.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.rekursjon; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import static org.junit.jupiter.api.Assertions.*; 6 | 7 | class RekursjonTest { 8 | 9 | @Test 10 | void fac() { 11 | assertEquals(Rekursjon.fac(5), 120); 12 | } 13 | 14 | @Test 15 | void sum() { 16 | assertEquals(Rekursjon.sum(10), 55); 17 | } 18 | 19 | @Test 20 | void iterativSum() { 21 | assertEquals(Rekursjon.iterativSum(10), 55); 22 | } 23 | 24 | @Test 25 | void binsok() { 26 | int [] liste = {2,5,6,8,9,23,45,56,64,67,89}; 27 | int nokkel = 56; 28 | int svar = Rekursjon.binsok(liste, nokkel, 0, liste.length-1); 29 | int riktigSvar = 7; 30 | 31 | assertEquals(svar, riktigSvar); 32 | 33 | nokkel = 3; 34 | 35 | svar = Rekursjon.binsok(liste, nokkel, 0, liste.length-1); 36 | riktigSvar = -1; 37 | 38 | assertEquals(svar, riktigSvar); 39 | } 40 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/service/ValutaService.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.service; 2 | 3 | import eriksommer.webprog.klientTjener1.model.Belop; 4 | import eriksommer.webprog.klientTjener1.model.Valuta; 5 | import org.springframework.stereotype.Service; 6 | 7 | import java.util.ArrayList; 8 | 9 | @Service 10 | public class ValutaService { 11 | 12 | private final ArrayList valutaRegister = new ArrayList<>(); 13 | 14 | public void loadData(){ 15 | Valuta sek = new Valuta("SEK", 0.85); 16 | Valuta usd = new Valuta("USD", 8.85); 17 | Valuta eur = new Valuta("EUR", 9.56); 18 | 19 | valutaRegister.add(sek); 20 | valutaRegister.add(usd); 21 | valutaRegister.add(eur); 22 | } 23 | 24 | public double beregn(Belop belop){ 25 | for (Valuta valuta : valutaRegister){ 26 | if (valuta.getSort().equals(belop.getSort())){ 27 | return valuta.getKurs() * belop.getVerdi(); 28 | } 29 | } 30 | return 0.0; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/resources/static/eksamen/v20/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
Fornavn
Etternavn
Klubb
E-post
Passord
38 |
39 | 40 | -------------------------------------------------------------------------------- /src/main/resources/static/javascript3/oving.js: -------------------------------------------------------------------------------- 1 | const liste = []; 2 | const objekter = []; 3 | 4 | function beregn() { 5 | document.getElementById("melding").innerHTML = ""; 6 | 7 | let input = document.getElementById("valg").value; 8 | document.getElementById("valg").value = ""; 9 | 10 | liste.push(input); 11 | 12 | for (let i = 0; i < liste.length; i++) { 13 | document.getElementById("melding").innerHTML += liste[i] + "
"; 14 | } 15 | 16 | for (let tekst of liste) { 17 | document.getElementById("melding").innerHTML += tekst + "
"; 18 | } 19 | } 20 | 21 | function objekt() { 22 | document.getElementById("melding").innerHTML = ""; 23 | 24 | const objekt1 = { 25 | navn: document.getElementById("objekt").value 26 | } 27 | 28 | objekter.push(objekt1); 29 | 30 | for (let i = 0; i < objekter.length; i++) { 31 | document.getElementById("melding").innerHTML += objekter[i].navn + "
"; 32 | } 33 | 34 | for (let objekt of objekter) { 35 | document.getElementById("melding").innerHTML += objekt.navn + "
"; 36 | } 37 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/rekursjon/controller/TowerOfHanoiController.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.rekursjon.controller; 2 | 3 | import eriksommer.webprog.rekursjon.model.TowerOfHanoi; 4 | import eriksommer.webprog.rekursjon.service.TowerOfHanoiService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | import java.util.ArrayList; 12 | 13 | @RestController 14 | @RequestMapping("/api/rekursjon/") 15 | public class TowerOfHanoiController { 16 | @Autowired 17 | TowerOfHanoiService service; 18 | 19 | @PostMapping("/hanoi") 20 | public void solve(TowerOfHanoi toh){ 21 | service.solvTowerOfHanoi(toh.getRings(), toh.getFromRod(), toh.getToRod(), toh.getTmpRod()); 22 | } 23 | 24 | @GetMapping("/hanoi") 25 | public ArrayList getSolution(){ 26 | return service.getSolution(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/rekursjon/model/TowerOfHanoi.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.rekursjon.model; 2 | 3 | public class TowerOfHanoi { 4 | private int rings; 5 | private int fromRod; 6 | private int toRod; 7 | private int tmpRod; 8 | 9 | public TowerOfHanoi(int rings, int fromRod, int toRod, int tmpRod) { 10 | this.rings = rings; 11 | this.fromRod = fromRod; 12 | this.toRod = toRod; 13 | this.tmpRod = tmpRod; 14 | } 15 | 16 | public int getRings() { 17 | return rings; 18 | } 19 | 20 | public void setRings(int rings) { 21 | this.rings = rings; 22 | } 23 | 24 | public int getFromRod() { 25 | return fromRod; 26 | } 27 | 28 | public void setFromRod(int fromRod) { 29 | this.fromRod = fromRod; 30 | } 31 | 32 | public int getToRod() { 33 | return toRod; 34 | } 35 | 36 | public void setToRod(int toRod) { 37 | this.toRod = toRod; 38 | } 39 | 40 | public int getTmpRod() { 41 | return tmpRod; 42 | } 43 | 44 | public void setTmpRod(int tmpRod) { 45 | this.tmpRod = tmpRod; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/resources/static/javascript1/js1.js: -------------------------------------------------------------------------------- 1 | //Oppgave 1 2 | function heiVerden() { 3 | document.write("Hei verden"); 4 | } 5 | 6 | //Oppgave 2 7 | function heiVerdenAlert() { 8 | alert("Hei verden"); 9 | } 10 | 11 | //Oppgave 3 12 | function skrivMelding(input) { 13 | document.write(input); 14 | } 15 | 16 | //Oppgave 4 17 | function writeAlert(data) { 18 | alert(data); 19 | } 20 | 21 | //Oppgave 5 22 | function writeConsole(data) { 23 | console.log(data); 24 | } 25 | 26 | //Oppgave 6 27 | function skrivMeldingFarget(input) { 28 | document.write(input.fontcolor("red")); 29 | } 30 | 31 | //Oppgave 7 32 | function tilStorBokstav(input) { 33 | document.write(input.toUpperCase()); 34 | } 35 | 36 | //Oppgave 8 37 | function skrivUtEn() { 38 | const ut = 1; 39 | console.log(ut); 40 | } 41 | 42 | //Oppgave 9 43 | let ut = 0; 44 | 45 | function tellOpp() { 46 | ut += 1; 47 | console.log(ut); 48 | } 49 | 50 | //Oppgave 10 51 | let out = 0; 52 | 53 | function tellOppMelding() { 54 | out += 1; 55 | let meldingP1 = "Du har trykket på knappen "; 56 | let meldingP2 = " ganger."; 57 | console.log(meldingP1 + out + meldingP2); 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/rekursjon/Rekursjon.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.rekursjon; 2 | 3 | public class Rekursjon { 4 | public static int fac(int tall) { 5 | if (tall < 0) { 6 | return -1; 7 | } 8 | if (tall == 0) { 9 | return 1; 10 | } 11 | return tall * fac(tall - 1); 12 | } 13 | 14 | public static int sum(int tall) { 15 | if (tall == 1) { 16 | return 1; 17 | } 18 | return tall + sum(tall - 1); 19 | } 20 | 21 | public static int iterativSum(int tall) { 22 | int sum = 0; 23 | 24 | for (int i = 0; i <= tall; i++) { 25 | sum += i; 26 | } 27 | return sum; 28 | } 29 | 30 | public static int binsok(int[] listen, int nokkel, int venstre, int hoyre) { 31 | if (venstre <= hoyre) { 32 | int split = (venstre + hoyre) / 2; 33 | if (listen[split] > nokkel) { 34 | return binsok(listen, nokkel, venstre, split - 1); 35 | } else if (listen[split] < nokkel) { 36 | return binsok(listen, nokkel, split + 1, hoyre); 37 | } else return split; // Funnet!! 38 | } else return -1; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/resources/static/eksamen/v20/logginn.js: -------------------------------------------------------------------------------- 1 | $(() => { 2 | $("#loggInn").click(() => { 3 | const info = { 4 | epost: $("#e-post").val(), 5 | passord: $("#passord").val() 6 | } 7 | 8 | if (validerBrukernavn(info.epost) && validerPassord(info.passord)) { 9 | $.post("/api/eksamen/v20/logginn", info, OK => { 10 | $("#loggetInn").html("Verifisering gikk fint") 11 | }) 12 | } 13 | }) 14 | }) 15 | 16 | const validerBrukernavn = brukernavn => { 17 | const regexp = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/; 18 | const ok = regexp.test(brukernavn); 19 | if (!ok) { 20 | $("#loggetInn").html("Navnet må bestå av 2 til 20 bokstaver"); 21 | return false; 22 | } else { 23 | $("#loggetInn").html(""); 24 | return true; 25 | } 26 | } 27 | 28 | const validerPassord = passord => { 29 | const regexp = /(?=.*[A-ZÆØÅa-zæøå])(?=.*\d)[A-ZÆØÅa-zæøå\d]{6,}/; 30 | const ok = regexp.test(passord); 31 | if (!ok) { 32 | $("#loggetInn").html("Passordet må være minimum 8 tegn, minst en bokstav og et tall"); 33 | return false; 34 | } else { 35 | $("#loggetInn").html(""); 36 | return true; 37 | } 38 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/generiskedatatyper/MobelRegister.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.generiskedatatyper; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.List; 6 | 7 | public class MobelRegister { 8 | private final List mobler; 9 | 10 | public MobelRegister() { 11 | mobler = new ArrayList<>(); 12 | } 13 | 14 | public void addMobel(T mobel) { 15 | mobler.add(mobel); 16 | } 17 | 18 | public T getMobel(int nummer) { 19 | for (T mobel : mobler) { 20 | if (mobel.getNummer() == nummer) 21 | return mobel; 22 | } 23 | return null; 24 | } 25 | 26 | public void slettMobel(int nummer) { 27 | mobler.removeIf(mobel -> mobel.getNummer() == nummer); 28 | } 29 | 30 | public void skrivUtAlle() { 31 | for (Mobel mobel : mobler) { 32 | System.out.println(mobel); 33 | } 34 | } 35 | 36 | public void sorter() { 37 | Collections.sort(mobler); 38 | } 39 | 40 | public void sorterMedComparator() { 41 | mobler.sort(new MobelComparator()); 42 | } 43 | 44 | public void sorterBordMedComparator() { 45 | mobler.sort(new BordComparator()); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/nybruker.js: -------------------------------------------------------------------------------- 1 | import validering from "./validering.js" 2 | import {apiSikkerhet as api} from "../apiurl.js" 3 | 4 | $(() => { 5 | $("#registrer").click(() => { 6 | const brukernavn = $("#brukernavn").val(); 7 | const passord = $("#passord").val(); 8 | 9 | const kunde = { 10 | brukernavn: brukernavn, 11 | passord: passord 12 | } 13 | 14 | if (validering.loginn()) { 15 | $.post(api + "/nybruker", kunde, () => { 16 | const url = "/loggInn?brukernavn=" + $("#brukernavn").val() + "&passord=" + $("#passord").val(); 17 | $.get(api + url, OK => { 18 | if (OK) { 19 | window.location.href = "/sikkerhet/liste.html"; 20 | } else { 21 | $("#feil").html("Feil i brukernavn eller passord"); 22 | } 23 | }).fail(jqXHR => { 24 | const json = $.parseJSON(jqXHR.responseText); 25 | $("#feil").html(json.message); 26 | }); 27 | }).fail(jqXHR => { 28 | const json = $.parseJSON(jqXHR.responseText); 29 | $("#feil").html(json.message); 30 | }); 31 | } 32 | }); 33 | }); -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/nedtrekkslister/repository/BilRepository.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.nedtrekkslister.repository; 2 | 3 | import eriksommer.webprog.nedtrekkslister.model.Bil; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.ArrayList; 7 | 8 | @Repository 9 | public class BilRepository { 10 | private final ArrayList billiste = new ArrayList<>(); 11 | 12 | public BilRepository() { 13 | this.billiste.add(new Bil("Audi", "R8 V10+")); 14 | this.billiste.add(new Bil("Audi", "RS4")); 15 | this.billiste.add(new Bil("Audi", "A3")); 16 | this.billiste.add(new Bil("Porche", "Tycan Turbo s")); 17 | this.billiste.add(new Bil("Porche", "911")); 18 | this.billiste.add(new Bil("Volvo", "XC90")); 19 | this.billiste.add(new Bil("Volvo", "XC60")); 20 | this.billiste.add(new Bil("Volvo", "XC40")); 21 | this.billiste.add(new Bil("Tesla", "Cyber Truck")); 22 | this.billiste.add(new Bil("Tesla", "Model 3")); 23 | this.billiste.add(new Bil("Tesla", "Model S")); 24 | } 25 | 26 | public void leggInn(Bil motorvogn) { 27 | billiste.add(motorvogn); 28 | } 29 | 30 | public ArrayList hentAlle() { 31 | return billiste; 32 | } 33 | 34 | public void slettAlle() { 35 | billiste.clear(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/resources/static/lagringserver/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Motorvognregister 1 6 | 7 | 8 | 9 | 10 |

Motorvognregister

11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
Eiers personnummerEiers navnEiers adresse
KjennetegnBilmerkeBiltype
33 | 34 |
35 | Alle bilene: 36 |
37 | 38 |
39 | 40 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/sikkerhet/service/Inputvalidering.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.sikkerhet.service; 2 | 3 | import eriksommer.webprog.sikkerhet.model.Motorvogn; 4 | import org.slf4j.Logger; 5 | 6 | public class Inputvalidering { 7 | public static boolean validerMotorvognOK(Motorvogn motorvogn, Logger logger) { 8 | String regexPersonnr = "[0-9]{11}"; 9 | String regexNavn = "[a-zA-ZæøåÆØÅ .\\-]{2,20}"; 10 | String regexAdresse = "[0-9a-zA-ZæøåÆØÅ ,.\\-]{2,30}"; 11 | String regexKjennetegn = "[A-Z][A-Z][0-9]{5}"; 12 | String regexMerke = "[a-zA-ZæøåÆØÅ.\\-]{2,10}"; 13 | String regexType = "[0-9a-zA-ZæøåÆØÅ.\\-]{2,10}"; 14 | 15 | boolean personnrOK = motorvogn.getPersonnr().matches(regexPersonnr); 16 | boolean navnOK = motorvogn.getNavn().matches(regexNavn); 17 | boolean adresseOK = motorvogn.getAdresse().matches(regexAdresse); 18 | boolean kjennetegnOK = motorvogn.getKjennetegn().matches(regexKjennetegn); 19 | boolean merkeOK = motorvogn.getMerke().matches(regexMerke); 20 | boolean typeOK = motorvogn.getType().matches(regexType); 21 | 22 | if (personnrOK && navnOK && adresseOK && kjennetegnOK && merkeOK && typeOK) { 23 | return true; 24 | } else { 25 | logger.error("Valideringsfeil"); 26 | return false; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/inputvalidering/service/Inputvalidering.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.inputvalidering.service; 2 | 3 | import eriksommer.webprog.inputvalidering.model.Motorvogn; 4 | import org.slf4j.Logger; 5 | 6 | public class Inputvalidering { 7 | public static boolean validerMotorvognOK(Motorvogn motorvogn, Logger logger) { 8 | String regexPersonnr = "[0-9]{11}"; 9 | String regexNavn = "[a-zA-ZæøåÆØÅ .\\-]{2,20}"; 10 | String regexAdresse = "[0-9a-zA-ZæøåÆØÅ ,.\\-]{2,30}"; 11 | String regexKjennetegn = "[A-Z][A-Z][0-9]{5}"; 12 | String regexMerke = "[a-zA-ZæøåÆØÅ.\\-]{2,10}"; 13 | String regexType = "[0-9a-zA-ZæøåÆØÅ.\\-]{2,10}"; 14 | 15 | boolean personnrOK = motorvogn.getPersonnr().matches(regexPersonnr); 16 | boolean navnOK = motorvogn.getNavn().matches(regexNavn); 17 | boolean adresseOK = motorvogn.getAdresse().matches(regexAdresse); 18 | boolean kjennetegnOK = motorvogn.getKjennetegn().matches(regexKjennetegn); 19 | boolean merkeOK = motorvogn.getMerke().matches(regexMerke); 20 | boolean typeOK = motorvogn.getType().matches(regexType); 21 | 22 | if (personnrOK && navnOK && adresseOK && kjennetegnOK && merkeOK && typeOK) { 23 | return true; 24 | }else { 25 | logger.error("Valideringsfeil"); 26 | return false; 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/relasjonsdatabase1/controller/Motorvogn4Controller.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.relasjonsdatabase1.controller; 2 | 3 | import eriksommer.webprog.relasjonsdatabase1.repository.Motorvogn4Repository; 4 | import eriksommer.webprog.relasjonsdatabase1.model.Bil; 5 | import eriksommer.webprog.relasjonsdatabase1.model.Motorvogn; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.web.bind.annotation.*; 8 | 9 | import java.util.List; 10 | 11 | @RestController 12 | @RequestMapping("/api/relasjonsdatabase1/") 13 | public class Motorvogn4Controller { 14 | 15 | @Autowired 16 | private Motorvogn4Repository rep; 17 | 18 | @GetMapping("/hentBiler") 19 | public List hentBiler() { 20 | return rep.hentAlleBiler(); 21 | } 22 | 23 | @PostMapping("/lagre") 24 | public void lagreKunde(Motorvogn motorvogn){ 25 | rep.lagreMotorvogn(motorvogn); 26 | } 27 | 28 | @GetMapping("/hentAlle") 29 | public List hentAlleMotorvogner(){ 30 | return rep.hentAlleMotorvogner(); 31 | } 32 | 33 | @DeleteMapping("/slettEnMotorvogn") 34 | public void slettEnMotorvogn(String personnr){ 35 | rep.slettEnMotorvogn(personnr); 36 | } 37 | 38 | @DeleteMapping("/slettAlle") 39 | public void slettAlleMotorvogner(){ 40 | rep.slettAlleMotorvogner(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Logg inn

15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 |
26 |
27 | 28 |
29 |
30 |
31 |
32 |
33 | 34 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/sesjoner/service/Inputvalidering.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.sesjoner.service; 2 | 3 | import eriksommer.webprog.sesjoner.model.Motorvogn; 4 | import org.slf4j.Logger; 5 | import org.springframework.stereotype.Service; 6 | 7 | @Service 8 | public class Inputvalidering { 9 | public static boolean validerMotorvognOK(Motorvogn motorvogn, Logger logger) { 10 | String regexPersonnr = "[0-9]{11}"; 11 | String regexNavn = "[a-zA-ZæøåÆØÅ .\\-]{2,20}"; 12 | String regexAdresse = "[0-9a-zA-ZæøåÆØÅ ,.\\-]{2,30}"; 13 | String regexKjennetegn = "[A-Z][A-Z][0-9]{5}"; 14 | String regexMerke = "[a-zA-ZæøåÆØÅ.\\-]{2,10}"; 15 | String regexType = "[0-9a-zA-ZæøåÆØÅ.\\-]{2,10}"; 16 | 17 | boolean personnrOK = motorvogn.getPersonnr().matches(regexPersonnr); 18 | boolean navnOK = motorvogn.getNavn().matches(regexNavn); 19 | boolean adresseOK = motorvogn.getAdresse().matches(regexAdresse); 20 | boolean kjennetegnOK = motorvogn.getKjennetegn().matches(regexKjennetegn); 21 | boolean merkeOK = motorvogn.getMerke().matches(regexMerke); 22 | boolean typeOK = motorvogn.getType().matches(regexType); 23 | 24 | if (personnrOK && navnOK && adresseOK && kjennetegnOK && merkeOK && typeOK) { 25 | return true; 26 | }else { 27 | logger.error("Valideringsfeil"); 28 | return false; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/nybruker.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Motorvognregister 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 |

Registrer bruker

15 |
16 | 17 |
18 | 19 | 20 |
21 |
22 | 23 |
24 | 25 | 26 | 27 |
28 |
29 |

30 | 31 |
32 |
33 |
34 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/datastrukturer/Stakk.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.datastrukturer; 2 | 3 | public class Stakk { 4 | private static class Node { 5 | private final int verdi; 6 | private Node neste; 7 | 8 | public Node(int verdi) { 9 | this.verdi = verdi; 10 | } 11 | } 12 | 13 | private Node topp; 14 | 15 | public Stakk() { 16 | this.topp = null; 17 | } 18 | 19 | public void push(int verdi) { 20 | Node node = new Node(verdi); 21 | 22 | node.neste = topp; 23 | topp = node; 24 | } 25 | 26 | public boolean tom() { 27 | return topp == null; 28 | } 29 | 30 | public int peek() { 31 | if (!tom()) { 32 | return topp.verdi; 33 | } else { 34 | System.out.println("Stacken er tom!"); 35 | return -1; 36 | } 37 | } 38 | 39 | public void pop() { 40 | if (topp == null) { 41 | System.out.println("Stack underflow"); 42 | return; 43 | } 44 | 45 | topp = topp.neste; 46 | } 47 | 48 | public void skrivUt() { 49 | if (topp == null) { 50 | System.out.println("Stack underflow"); 51 | System.exit(1); 52 | } else { 53 | Node node = topp; 54 | while (node != null) { 55 | System.out.print(node.verdi + " "); 56 | node = node.neste; 57 | } 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/resources/static/javascript1/js1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Javascript 1 - Ukesoppgaver 6 | 7 | 8 | 9 |

Ukesoppgaver javascript 1

10 | 11 |

Oppgave 1

12 | 13 | 14 |

Oppgave 2

15 | 16 | 17 |

Oppgave 3

18 |

Skriv melding: 19 | 22 |

23 | 24 |

Oppgave 4

25 |
26 | 29 |
30 |

Oppgave 5

31 |
32 | 35 |
36 | 37 |

Oppgave 6

38 |

Melding blir farget rød: 39 | 42 |

43 | 44 |

Oppgave 7

45 |

Gir store bokstaver: 46 | 49 |

50 | 51 |

Oppgave 8

52 | 53 | 54 |

Oppgave 9

55 | 56 | 57 |

Oppgave 10

58 | 59 | 60 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/generiskedatatyper/Mobel.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.generiskedatatyper; 2 | 3 | public abstract class Mobel implements Comparable { 4 | private String navn; 5 | private String type; 6 | private int vekt; 7 | private int pris; 8 | private int nummer; 9 | 10 | public Mobel(String navn, String type, int vekt, int pris, int nummer) { 11 | this.navn = navn; 12 | this.type = type; 13 | this.vekt = vekt; 14 | this.pris = pris; 15 | this.nummer = nummer; 16 | } 17 | 18 | public String getNavn() { 19 | return navn; 20 | } 21 | 22 | public void setNavn(String navn) { 23 | this.navn = navn; 24 | } 25 | 26 | public String getType() { 27 | return type; 28 | } 29 | 30 | public void setType(String type) { 31 | this.type = type; 32 | } 33 | 34 | public int getVekt() { 35 | return vekt; 36 | } 37 | 38 | public void setVekt(int vekt) { 39 | this.vekt = vekt; 40 | } 41 | 42 | public int getPris() { 43 | return pris; 44 | } 45 | 46 | public void setPris(int pris) { 47 | this.pris = pris; 48 | } 49 | 50 | public int getNummer() { 51 | return nummer; 52 | } 53 | 54 | public void setNummer(int nummer) { 55 | this.nummer = nummer; 56 | } 57 | 58 | public abstract String toString(); 59 | 60 | // oppgave 3 61 | public int compareTo(Mobel o) { 62 | return this.getNummer() - ((Mobel) o).getNummer(); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/index.js: -------------------------------------------------------------------------------- 1 | import validering from "./validering.js" 2 | import {apiSikkerhet as api} from "../apiurl.js" 3 | 4 | $(() => { 5 | $("#loggInn").click(() => { 6 | if (validering.loginn()) { 7 | const url = "/loggInn?brukernavn=" + $("#brukernavn").val() + "&passord=" + $("#passord").val(); 8 | $.get(api + url, OK => { 9 | if (OK) { 10 | window.location.href = "/sikkerhet/liste.html"; 11 | } else { 12 | $("#feil").html("Feil i brukernavn eller passord"); 13 | } 14 | }) 15 | .fail(jqXHR => { 16 | const json = $.parseJSON(jqXHR.responseText); 17 | $("#feil").html(json.message); 18 | }); 19 | } 20 | }); 21 | 22 | $("#registrer").click(() => { 23 | window.location.href = "/sikkerhet/nybruker.html"; 24 | }); 25 | 26 | $("#krypterAllePassord").click(() => { 27 | $.get(api + "/krypterAllePassord", OK => { 28 | if (OK) { 29 | $("#feil").html("Kryptering utført!"); 30 | } else { 31 | $("#feil").html("Feil i kryptering!"); 32 | } 33 | }) 34 | .fail(jqXHR => { 35 | const json = $.parseJSON(jqXHR.responseText); 36 | $("#feil").html(json.message); 37 | }); 38 | }); 39 | 40 | $("#brukernavn").on("change", () => validering.brukernavn()); 41 | $("#passord").on("change", () => validering.passord()); 42 | }); -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Logg inn

15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 |
26 |
27 | 28 | 29 |


30 | 31 |
32 |
33 |
34 |
35 |
36 | 37 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/eksamen/v20/Skiloper.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.eksamen.v20; 2 | 3 | public class Skiloper { 4 | private int id; 5 | private String fornavn; 6 | private String etternavn; 7 | private String klubb; 8 | private String epost; 9 | private String passord; 10 | 11 | public Skiloper(int id, String fornavn, String etternavn, String klubb, String epost, String passord) { 12 | this.id = id; 13 | this.fornavn = fornavn; 14 | this.etternavn = etternavn; 15 | this.klubb = klubb; 16 | this.epost = epost; 17 | this.passord = passord; 18 | } 19 | 20 | public Skiloper(){} 21 | 22 | public int getId() { 23 | return id; 24 | } 25 | 26 | public void setId(int id) { 27 | this.id = id; 28 | } 29 | 30 | public String getFornavn() { 31 | return fornavn; 32 | } 33 | 34 | public void setFornavn(String fornavn) { 35 | this.fornavn = fornavn; 36 | } 37 | 38 | public String getEtternavn() { 39 | return etternavn; 40 | } 41 | 42 | public void setEtternavn(String etternavn) { 43 | this.etternavn = etternavn; 44 | } 45 | 46 | public String getKlubb() { 47 | return klubb; 48 | } 49 | 50 | public void setKlubb(String klubb) { 51 | this.klubb = klubb; 52 | } 53 | 54 | public String getEpost() { 55 | return epost; 56 | } 57 | 58 | public void setEpost(String epost) { 59 | this.epost = epost; 60 | } 61 | 62 | public String getPassord() { 63 | return passord; 64 | } 65 | 66 | public void setPassord(String passord) { 67 | this.passord = passord; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/ovinger/Sorting.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.ovinger; 2 | 3 | import java.util.*; 4 | 5 | class Person implements Comparable { 6 | private String navn; 7 | private int alder; 8 | 9 | public Person(String navn, int alder) { 10 | this.navn = navn; 11 | this.alder = alder; 12 | } 13 | 14 | public String getNavn() { 15 | return navn; 16 | } 17 | 18 | public void setNavn(String navn) { 19 | this.navn = navn; 20 | } 21 | 22 | public int getAlder() { 23 | return alder; 24 | } 25 | 26 | public void setAlder(int alder) { 27 | this.alder = alder; 28 | } 29 | 30 | @Override 31 | public String toString() { 32 | return "Person{" + 33 | "navn='" + navn + '\'' + 34 | ", alder=" + alder + 35 | '}'; 36 | } 37 | 38 | @Override 39 | public int compareTo(Person o) { 40 | return this.getNavn().compareTo(o.getNavn()); 41 | } 42 | } 43 | 44 | public class Sorting { 45 | public static void main(String[] args) { 46 | List liste = new ArrayList<>(Arrays.asList(new Person("Petter", 34), new Person("Ana", 21))); 47 | System.out.println("Usortert!"); 48 | for (Person person : liste) { 49 | System.out.println(person); 50 | } 51 | //Sortering med comparator 52 | liste.sort((person1, person2) -> person1.getNavn().compareTo(person2.getNavn())); 53 | //Sortering med comparable 54 | Collections.sort(liste); 55 | System.out.println("Sortert!"); 56 | for (Person person : liste) { 57 | System.out.println(person); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/nedtrekkslister/model/Motorvogn.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.nedtrekkslister.model; 2 | 3 | public class Motorvogn { 4 | private String personnr; 5 | private String navn; 6 | private String adresse; 7 | private String kjennetegn; 8 | private String merke; 9 | private String type; 10 | 11 | public Motorvogn(String personnr, String navn, String adresse, String kjennetegn, String merke, String type) { 12 | this.personnr = personnr; 13 | this.navn = navn; 14 | this.adresse = adresse; 15 | this.kjennetegn = kjennetegn; 16 | this.merke = merke; 17 | this.type = type; 18 | } 19 | 20 | public String getPersonnr() { 21 | return personnr; 22 | } 23 | 24 | public void setPersonnr(String personnr) { 25 | this.personnr = personnr; 26 | } 27 | 28 | public String getNavn() { 29 | return navn; 30 | } 31 | 32 | public void setNavn(String navn) { 33 | this.navn = navn; 34 | } 35 | 36 | public String getAdresse() { 37 | return adresse; 38 | } 39 | 40 | public void setAdresse(String adresse) { 41 | this.adresse = adresse; 42 | } 43 | 44 | public String getKjennetegn() { 45 | return kjennetegn; 46 | } 47 | 48 | public void setKjennetegn(String kjennetegn) { 49 | this.kjennetegn = kjennetegn; 50 | } 51 | 52 | public String getMerke() { 53 | return merke; 54 | } 55 | 56 | public void setMerke(String merke) { 57 | this.merke = merke; 58 | } 59 | 60 | public String getType() { 61 | return type; 62 | } 63 | 64 | public void setType(String type) { 65 | this.type = type; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/relasjonsdatabase1/model/Motorvogn.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.relasjonsdatabase1.model; 2 | 3 | public class Motorvogn { 4 | private int personnr; // Primær nøkkel - må være int 5 | private String navn; 6 | private String adresse; 7 | private String kjennetegn; 8 | private String merke; 9 | private String type; 10 | 11 | public Motorvogn(int personnr, String navn, String adresse, String kjennetegn, String merke, String type) { 12 | this.personnr = personnr; 13 | this.navn = navn; 14 | this.adresse = adresse; 15 | this.kjennetegn = kjennetegn; 16 | this.merke = merke; 17 | this.type = type; 18 | } 19 | 20 | public Motorvogn() {} 21 | 22 | public int getPersonnr() { 23 | return personnr; 24 | } 25 | 26 | public void setPersonnr(int personnr) { 27 | this.personnr = personnr; 28 | } 29 | 30 | public String getNavn() { 31 | return navn; 32 | } 33 | 34 | public void setNavn(String navn) { 35 | this.navn = navn; 36 | } 37 | 38 | public String getAdresse() { 39 | return adresse; 40 | } 41 | 42 | public void setAdresse(String adresse) { 43 | this.adresse = adresse; 44 | } 45 | 46 | public String getKjennetegn() { 47 | return kjennetegn; 48 | } 49 | 50 | public void setKjennetegn(String kjennetegn) { 51 | this.kjennetegn = kjennetegn; 52 | } 53 | 54 | public String getMerke() { 55 | return merke; 56 | } 57 | 58 | public void setMerke(String merke) { 59 | this.merke = merke; 60 | } 61 | 62 | public String getType() { 63 | return type; 64 | } 65 | 66 | public void setType(String type) { 67 | this.type = type; 68 | } 69 | } -------------------------------------------------------------------------------- /src/main/resources/static/inputvalidering/index.js: -------------------------------------------------------------------------------- 1 | import {apiInputvalidering as api} from "../apiurl.js" 2 | 3 | $(() => { // kjøres når dokumentet er ferdig lastet 4 | hentAlle(); 5 | 6 | $("#slettAlle").click(() => $.get(api + "/slettAlle", () => hentAlle())); 7 | }); 8 | 9 | const hentAlle = () => { 10 | $.get(api + "/hentAlle", biler => formaterData(biler)) 11 | .fail(jqXHR => { 12 | const json = $.parseJSON(jqXHR.responseText); 13 | $("#feil").html(json.message); 14 | }); 15 | } 16 | 17 | const formaterData = biler => { 18 | let ut = "" + 19 | ""; 20 | for (const bil of biler) { 21 | ut += "" + 22 | "" + 23 | "" + 24 | "" + 25 | ""; 26 | } 27 | ut += "
PersonnrNavnAdresseKjennetegnMerkeType
" + bil.personnr + "" + bil.navn + "" + bil.adresse + "" + bil.kjennetegn + "" + bil.merke + "" + bil.type + "
"; 28 | $("#bilene").html(ut); 29 | 30 | addEventListeners(biler); 31 | } 32 | 33 | const addEventListeners = biler => { 34 | for (const {personnr, id} of biler) { 35 | $("#" + personnr).on("click", () => slettEnMotorvogn(personnr)); 36 | $("#" + id).on("click", () => idTilEndring(id)); 37 | } 38 | } 39 | 40 | const idTilEndring = id => window.location.href = "/inputvalidering/endre.html?" + id; 41 | 42 | const slettEnMotorvogn = personnr => { 43 | const url = "/slettEnMotorvogn?personnr=" + personnr; 44 | $.get(api + url, () => window.location.href = "/inputvalidering/index.html"); 45 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/sesjoner/model/Motorvogn.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.sesjoner.model; 2 | 3 | public class Motorvogn { 4 | private int id; 5 | private String personnr; 6 | private String navn; 7 | private String adresse; 8 | private String kjennetegn; 9 | private String merke; 10 | private String type; 11 | 12 | public Motorvogn(String personnr, String navn, String adresse, String kjennetegn, String merke, String type) { 13 | this.personnr = personnr; 14 | this.navn = navn; 15 | this.adresse = adresse; 16 | this.kjennetegn = kjennetegn; 17 | this.merke = merke; 18 | this.type = type; 19 | } 20 | 21 | public Motorvogn() { 22 | } 23 | 24 | public int getId() { 25 | return id; 26 | } 27 | 28 | public void setId(int id) { 29 | this.id = id; 30 | } 31 | 32 | public String getPersonnr() { 33 | return personnr; 34 | } 35 | 36 | public void setPersonnr(String personnr) { 37 | this.personnr = personnr; 38 | } 39 | 40 | public String getNavn() { 41 | return navn; 42 | } 43 | 44 | public void setNavn(String navn) { 45 | this.navn = navn; 46 | } 47 | 48 | public String getAdresse() { 49 | return adresse; 50 | } 51 | 52 | public void setAdresse(String adresse) { 53 | this.adresse = adresse; 54 | } 55 | 56 | public String getKjennetegn() { 57 | return kjennetegn; 58 | } 59 | 60 | public void setKjennetegn(String kjennetegn) { 61 | this.kjennetegn = kjennetegn; 62 | } 63 | 64 | public String getMerke() { 65 | return merke; 66 | } 67 | 68 | public void setMerke(String merke) { 69 | this.merke = merke; 70 | } 71 | 72 | public String getType() { 73 | return type; 74 | } 75 | 76 | public void setType(String type) { 77 | this.type = type; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/sikkerhet/model/Motorvogn.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.sikkerhet.model; 2 | 3 | public class Motorvogn { 4 | private int id; 5 | private String personnr; 6 | private String navn; 7 | private String adresse; 8 | private String kjennetegn; 9 | private String merke; 10 | private String type; 11 | 12 | public Motorvogn(String personnr, String navn, String adresse, String kjennetegn, String merke, String type) { 13 | this.personnr = personnr; 14 | this.navn = navn; 15 | this.adresse = adresse; 16 | this.kjennetegn = kjennetegn; 17 | this.merke = merke; 18 | this.type = type; 19 | } 20 | 21 | public Motorvogn() { 22 | } 23 | 24 | public int getId() { 25 | return id; 26 | } 27 | 28 | public void setId(int id) { 29 | this.id = id; 30 | } 31 | 32 | public String getPersonnr() { 33 | return personnr; 34 | } 35 | 36 | public void setPersonnr(String personnr) { 37 | this.personnr = personnr; 38 | } 39 | 40 | public String getNavn() { 41 | return navn; 42 | } 43 | 44 | public void setNavn(String navn) { 45 | this.navn = navn; 46 | } 47 | 48 | public String getAdresse() { 49 | return adresse; 50 | } 51 | 52 | public void setAdresse(String adresse) { 53 | this.adresse = adresse; 54 | } 55 | 56 | public String getKjennetegn() { 57 | return kjennetegn; 58 | } 59 | 60 | public void setKjennetegn(String kjennetegn) { 61 | this.kjennetegn = kjennetegn; 62 | } 63 | 64 | public String getMerke() { 65 | return merke; 66 | } 67 | 68 | public void setMerke(String merke) { 69 | this.merke = merke; 70 | } 71 | 72 | public String getType() { 73 | return type; 74 | } 75 | 76 | public void setType(String type) { 77 | this.type = type; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/inputvalidering/model/Motorvogn.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.inputvalidering.model; 2 | 3 | public class Motorvogn { 4 | private int id; 5 | private String personnr; 6 | private String navn; 7 | private String adresse; 8 | private String kjennetegn; 9 | private String merke; 10 | private String type; 11 | 12 | public Motorvogn(int id, String personnr, String navn, String adresse, String kjennetegn, String merke, String type) { 13 | this.id = id; 14 | this.personnr = personnr; 15 | this.navn = navn; 16 | this.adresse = adresse; 17 | this.kjennetegn = kjennetegn; 18 | this.merke = merke; 19 | this.type = type; 20 | } 21 | 22 | public Motorvogn() { 23 | } 24 | 25 | public int getId() { 26 | return id; 27 | } 28 | 29 | public void setId(int id) { 30 | this.id = id; 31 | } 32 | 33 | public String getPersonnr() { 34 | return personnr; 35 | } 36 | 37 | public void setPersonnr(String personnr) { 38 | this.personnr = personnr; 39 | } 40 | 41 | public String getNavn() { 42 | return navn; 43 | } 44 | 45 | public void setNavn(String navn) { 46 | this.navn = navn; 47 | } 48 | 49 | public String getAdresse() { 50 | return adresse; 51 | } 52 | 53 | public void setAdresse(String adresse) { 54 | this.adresse = adresse; 55 | } 56 | 57 | public String getKjennetegn() { 58 | return kjennetegn; 59 | } 60 | 61 | public void setKjennetegn(String kjennetegn) { 62 | this.kjennetegn = kjennetegn; 63 | } 64 | 65 | public String getMerke() { 66 | return merke; 67 | } 68 | 69 | public void setMerke(String merke) { 70 | this.merke = merke; 71 | } 72 | 73 | public String getType() { 74 | return type; 75 | } 76 | 77 | public void setType(String type) { 78 | this.type = type; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/lagringserver/model/Motorvogn.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.lagringserver.model; 2 | 3 | /** 4 | * An empty constructor is needed to create a new instance via reflection by 5 | * your persistence framework. If you don't provide any additional constructors 6 | * with arguments for the class, you don't need to provide an empty constructor 7 | * because you get one per default. 8 | */ 9 | public class Motorvogn { 10 | private String personnr; 11 | private String navn; 12 | private String adresse; 13 | private String kjennetegn; 14 | private String merke; 15 | private String type; 16 | 17 | public Motorvogn(String personnr, String navn, String adresse, String kjennetegn, String merke, String type) { 18 | this.personnr = personnr; 19 | this.navn = navn; 20 | this.adresse = adresse; 21 | this.kjennetegn = kjennetegn; 22 | this.merke = merke; 23 | this.type = type; 24 | } 25 | 26 | public String getPersonnr() { 27 | return personnr; 28 | } 29 | 30 | public void setPersonnr(String personnr) { 31 | this.personnr = personnr; 32 | } 33 | 34 | public String getNavn() { 35 | return navn; 36 | } 37 | 38 | public void setNavn(String navn) { 39 | this.navn = navn; 40 | } 41 | 42 | public String getAdresse() { 43 | return adresse; 44 | } 45 | 46 | public void setAdresse(String adresse) { 47 | this.adresse = adresse; 48 | } 49 | 50 | public String getKjennetegn() { 51 | return kjennetegn; 52 | } 53 | 54 | public void setKjennetegn(String kjennetegn) { 55 | this.kjennetegn = kjennetegn; 56 | } 57 | 58 | public String getMerke() { 59 | return merke; 60 | } 61 | 62 | public void setMerke(String merke) { 63 | this.merke = merke; 64 | } 65 | 66 | public String getType() { 67 | return type; 68 | } 69 | 70 | public void setType(String type) { 71 | this.type = type; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/klientTjener1/controller/KalkulatorController.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.klientTjener1.controller; 2 | 3 | import eriksommer.webprog.klientTjener1.service.KalkulatorService; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | @RestController 12 | @RequestMapping("/api/klienttjener1") 13 | public class KalkulatorController { 14 | 15 | @Autowired 16 | KalkulatorService service; 17 | 18 | private final Logger logger = LoggerFactory.getLogger(KalkulatorController.class); 19 | 20 | @GetMapping("/pluss") 21 | public double pluss(double tall1, double tall2) { 22 | try { 23 | return service.addere(tall1, tall2); 24 | } catch (Exception e) { 25 | logger.error("Feil i adderingen : " + e); 26 | return 0.0; 27 | } 28 | } 29 | 30 | @GetMapping("/minus") 31 | public double minus(double tall1, double tall2) { 32 | try { 33 | return service.subtrahere(tall1, tall2); 34 | } catch (Exception e) { 35 | logger.error("Feil i subtraksjonen : " + e); 36 | return 0.0; 37 | } 38 | 39 | } 40 | 41 | @GetMapping("/gange") 42 | public double gange(double tall1, double tall2) { 43 | try { 44 | return service.multiplisere(tall1, tall2); 45 | } catch (Exception e) { 46 | logger.error("Feil i multipliseringen : " + e); 47 | return 0.0; 48 | } 49 | } 50 | 51 | @GetMapping("/dele") 52 | public double dele(double tall1, double tall2) { 53 | try { 54 | return service.dividere(tall1, tall2); 55 | } catch (Exception e) { 56 | logger.error("Feil i divideringen : " + e); 57 | return 0.0; 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/relasjonsdatabase1/repository/Motorvogn4Repository.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.relasjonsdatabase1.repository; 2 | 3 | import eriksommer.webprog.relasjonsdatabase1.model.Bil; 4 | import eriksommer.webprog.relasjonsdatabase1.model.Motorvogn; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.jdbc.core.BeanPropertyRowMapper; 9 | import org.springframework.jdbc.core.JdbcTemplate; 10 | import org.springframework.stereotype.Repository; 11 | 12 | import java.util.Comparator; 13 | import java.util.List; 14 | 15 | @Repository 16 | public class Motorvogn4Repository { 17 | 18 | @Autowired 19 | private JdbcTemplate db; 20 | 21 | private final Logger logger = LoggerFactory.getLogger(Motorvogn4Repository.class); 22 | 23 | public void lagreMotorvogn(Motorvogn motorvogn) { 24 | String sql = "INSERT INTO Motorvogn (personnr,navn,adresse,kjennetegn,merke,type) VALUES(?,?,?,?,?,?)"; 25 | db.update(sql, motorvogn.getPersonnr(), motorvogn.getNavn(), motorvogn.getAdresse(), motorvogn.getKjennetegn(), 26 | motorvogn.getMerke(), motorvogn.getType()); 27 | } 28 | 29 | public List hentAlleMotorvogner() { 30 | String sql = "SELECT * FROM Motorvogn"; 31 | List list = db.query(sql, new BeanPropertyRowMapper(Motorvogn.class)); 32 | list.sort((o1, o2) -> o1.getNavn().compareTo(o2.getNavn())); 33 | list.sort(Comparator.comparing(Motorvogn::getMerke)); 34 | return list; 35 | } 36 | 37 | public void slettEnMotorvogn(String personnr) { 38 | String sql = "DELETE FROM Motorvogn WHERE personnr=?"; 39 | db.update(sql, personnr); 40 | } 41 | 42 | public void slettAlleMotorvogner() { 43 | String sql = "DELETE FROM Motorvogn"; 44 | db.update(sql); 45 | } 46 | 47 | public List hentAlleBiler() { 48 | String sql = "SELECT * FROM Bil"; 49 | return db.query(sql, new BeanPropertyRowMapper(Bil.class)); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/relasjonsdatabase2/model/Motorvogn.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.relasjonsdatabase2.model; 2 | 3 | import javax.persistence.Entity; 4 | import javax.persistence.Id; 5 | 6 | @Entity 7 | public class Motorvogn { 8 | private int id; 9 | private int personnr; 10 | private String navn; 11 | private String adresse; 12 | private String kjennetegn; 13 | private String merke; 14 | private String type; 15 | 16 | public Motorvogn(int id, int personnr, String navn, String adresse, String kjennetegn, String merke, String type) { 17 | this.id = id; 18 | this.personnr = personnr; 19 | this.navn = navn; 20 | this.adresse = adresse; 21 | this.kjennetegn = kjennetegn; 22 | this.merke = merke; 23 | this.type = type; 24 | } 25 | 26 | public Motorvogn() { 27 | } 28 | 29 | @Id 30 | public int getId() { 31 | return id; 32 | } 33 | 34 | public void setId(int id) { 35 | this.id = id; 36 | } 37 | 38 | public int getPersonnr() { 39 | return personnr; 40 | } 41 | 42 | public void setPersonnr(int personnr) { 43 | this.personnr = personnr; 44 | } 45 | 46 | public String getNavn() { 47 | return navn; 48 | } 49 | 50 | public void setNavn(String navn) { 51 | this.navn = navn; 52 | } 53 | 54 | public String getAdresse() { 55 | return adresse; 56 | } 57 | 58 | public void setAdresse(String adresse) { 59 | this.adresse = adresse; 60 | } 61 | 62 | public String getKjennetegn() { 63 | return kjennetegn; 64 | } 65 | 66 | public void setKjennetegn(String kjennetegn) { 67 | this.kjennetegn = kjennetegn; 68 | } 69 | 70 | public String getMerke() { 71 | return merke; 72 | } 73 | 74 | public void setMerke(String merke) { 75 | this.merke = merke; 76 | } 77 | 78 | public String getType() { 79 | return type; 80 | } 81 | 82 | public void setType(String type) { 83 | this.type = type; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/resources/static/klientTjener1/kalkulator.js: -------------------------------------------------------------------------------- 1 | import { apiKlinetTjener1 as api} from "../apiurl.js" 2 | 3 | $(() => { 4 | const tall1 = $("#tall1"); 5 | const tall2 = $("#tall2"); 6 | 7 | $("#pluss").click(() => { 8 | if (inputvalidering(tall1.val(), tall2.val())) { 9 | $.get(api + "/pluss?tall1=" + tall1.val() + "&tall2=" + tall2.val(), sum => { 10 | $("#output").html(tall1.val() + " + " + $("#tall2").val() + " = " + sum); 11 | }); 12 | } else { 13 | $("#output").html("Du har ikke oppgitt to tall"); 14 | } 15 | }); 16 | 17 | $("#minus").click(() => { 18 | if (inputvalidering(tall1.val(), tall2.val())) { 19 | $.get(api + "/minus?tall1=" + tall1.val() + "&tall2=" + tall2.val(), sum => { 20 | $("#output").html(tall1.val() + " - " + $("#tall2").val() + " = " + sum); 21 | }); 22 | } else { 23 | $("#output").html("Du har ikke oppgitt to tall"); 24 | } 25 | }); 26 | 27 | $("#gange").click(() => { 28 | if (inputvalidering(tall1.val(), tall2.val())) { 29 | $.get(api + "/gange?tall1=" + tall1.val() + "&tall2=" + tall2.val(), sum => { 30 | $("#output").html(tall1.val() + " * " + $("#tall2").val() + " = " + sum); 31 | }); 32 | } else { 33 | $("#output").html("Du har ikke oppgitt to tall"); 34 | } 35 | }); 36 | 37 | $("#dele").click(() => { 38 | if (tall2.val() === "0") { 39 | $("#output").html("Du kan ikke dele på 0"); 40 | } else if (inputvalidering(tall1.val(), tall2.val())) { 41 | $.get(api + "/dele?tall1=" + tall1.val() + "&tall2=" + tall2.val(), sum => { 42 | $("#output").html(tall1.val() + " / " + $("#tall2").val() + " = " + sum); 43 | }); 44 | } else { 45 | $("#output").html("Du har ikke oppgitt to tall"); 46 | } 47 | }); 48 | 49 | const inputvalidering = (tall1, tall2) => { 50 | return !(isNaN(tall1) || isNaN(tall2) || tall1 === "" || tall2 === ""); 51 | } 52 | }); -------------------------------------------------------------------------------- /src/main/resources/static/relasjonsdatabase2/registrere.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Motorvognregister

15 |
16 |
17 | 18 | 19 |
20 |
21 | 22 | 23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 37 |
38 |
39 | 40 | 43 |
44 |
45 | 46 |
47 |
48 |
49 |
50 |
51 | 52 | -------------------------------------------------------------------------------- /src/main/resources/static/inputvalidering/registrere.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Motorvognregister

15 |
16 |
17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 |
26 |
27 | 28 | 29 | 30 |
31 |
32 | 33 | 34 | 35 |
36 |
37 | 38 | 41 | 42 |
43 |
44 | 45 | 48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 | 56 | -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/liste.js: -------------------------------------------------------------------------------- 1 | import {apiSesjoner as api} from "../apiurl.js" 2 | 3 | $(() => { // kjøres når dokumentet er ferdig lastet 4 | hentAlle(); 5 | 6 | $("#slettAlle").click(() => { 7 | $.get(api + "/slettAlle", () => { 8 | hentAlle(); 9 | }); 10 | }); 11 | 12 | $("#loggUt").click(() => { 13 | $.get(api + "/loggUt", () => { 14 | window.location.href = "/sesjoner/index.html"; 15 | }); 16 | }); 17 | }); 18 | 19 | const hentAlle = () => { 20 | $.get(api + "/hentAlle", biler => { 21 | formaterData(biler); 22 | }) 23 | .fail(jqXHR => { 24 | const json = $.parseJSON(jqXHR.responseText); 25 | $("#feil").html(json.message); 26 | }); 27 | } 28 | 29 | const formaterData = biler => { 30 | let ut = "" + 31 | ""; 32 | for (const bil of biler) { 33 | ut += "" + 34 | "" + 35 | "" + 36 | "" + 37 | ""; 38 | } 39 | ut += "
PersonnrNavnAdresseKjennetegnMerkeType
" + bil.personnr + "" + bil.navn + "" + bil.adresse + "" + bil.kjennetegn + "" + bil.merke + "" + bil.type + "
"; 40 | $("#bilene").html(ut); 41 | 42 | addEventListeners(biler); 43 | } 44 | 45 | const addEventListeners = biler => { 46 | for (const {personnr, id} of biler) { 47 | $("#" + personnr).on("click", () => slettEnMotorvogn(personnr)); 48 | $("#" + id).on("click", () => idTilEndring(id)); 49 | } 50 | } 51 | 52 | const idTilEndring = id => { 53 | window.location.href = "/sesjoner/endre.html?" + id; 54 | } 55 | 56 | const slettEnMotorvogn = personnr => { 57 | const url = "/slettEnMotorvogn?personnr=" + personnr; 58 | $.get(api + url, () => { 59 | window.location.href = "/sesjoner/liste.html"; 60 | }); 61 | } 62 | -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/liste.js: -------------------------------------------------------------------------------- 1 | import {apiSikkerhet as api} from "../apiurl.js" 2 | 3 | $(() => { // kjøres når dokumentet er ferdig lastet 4 | hentAlle(); 5 | 6 | $("#slettAlle").click(() => { 7 | $.get(api + "/slettAlle", () => { 8 | hentAlle(); 9 | }); 10 | }); 11 | 12 | $("#loggUt").click(() => { 13 | $.get(api + "/loggUt", () => { 14 | window.location.href = "/sikkerhet/index.html"; 15 | }); 16 | }); 17 | }); 18 | 19 | const hentAlle = () => { 20 | $.get(api + "/hentAlle", biler => { 21 | formaterData(biler); 22 | }) 23 | .fail(jqXHR => { 24 | const json = $.parseJSON(jqXHR.responseText); 25 | $("#feil").html(json.message); 26 | }); 27 | } 28 | 29 | const formaterData = biler => { 30 | let ut = "" + 31 | ""; 32 | for (const bil of biler) { 33 | ut += "" + 34 | "" + 35 | "" + 36 | "" + 37 | ""; 38 | } 39 | ut += "
PersonnrNavnAdresseKjennetegnMerkeType
" + bil.personnr + "" + bil.navn + "" + bil.adresse + "" + bil.kjennetegn + "" + bil.merke + "" + bil.type + "
"; 40 | $("#bilene").html(ut); 41 | 42 | addEventListeners(biler); 43 | } 44 | 45 | const addEventListeners = biler => { 46 | for (const {personnr, id} of biler) { 47 | $("#" + personnr).on("click", () => slettEnMotorvogn(personnr)); 48 | $("#" + id).on("click", () => idTilEndring(id)); 49 | } 50 | } 51 | 52 | const idTilEndring = id => { 53 | window.location.href = "/sikkerhet/endre.html?" + id; 54 | } 55 | 56 | const slettEnMotorvogn = personnr => { 57 | const url = "/slettEnMotorvogn?personnr=" + personnr; 58 | $.get(api + url, () => { 59 | window.location.href = "/sikkerhet/liste.html"; 60 | }); 61 | } 62 | 63 | -------------------------------------------------------------------------------- /src/main/resources/static/relasjonsdatabase2/endre.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Motorvognregister

15 |
16 | 17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 | 28 |
29 |
30 | 31 | 32 |
33 |
34 | 35 | 38 |
39 |
40 | 41 | 44 |
45 |
46 | 47 |
48 |
49 |
50 |
51 |
52 | 53 | -------------------------------------------------------------------------------- /src/main/resources/static/relasjonsdatabase2/registrere.js: -------------------------------------------------------------------------------- 1 | import {apiRelasjonsdatabase2 as api} from "../apiurl.js" 2 | 3 | $(() => { // kjøres når dokumentet er ferdig lastet 4 | hentAlleBiler(); 5 | 6 | $("#regMotorvogn").click(() => { 7 | const motorvogn = { 8 | personnr: $("#personnr").val(), 9 | navn: $("#navn").val(), 10 | adresse: $("#adresse").val(), 11 | kjennetegn: $("#kjennetegn").val(), 12 | merke: $("#valgtMerke").val(), 13 | type: $("#valgtType").val(), 14 | }; 15 | 16 | $.post(api + "/lagre", motorvogn, () => hentAlleBiler()); 17 | 18 | window.location.href = "/relasjonsdatabase2/index.html"; 19 | }); 20 | }); 21 | 22 | const hentAlleBiler = () => { 23 | $.get(api + "/hentBiler", biler => formaterBiler(biler)) 24 | .fail(jqXHR => { 25 | const json = $.parseJSON(jqXHR.responseText); 26 | $("#feil").html(json.message); 27 | }); 28 | } 29 | 30 | const formaterBiler = biler => { 31 | $("#valgtMerke").off(); 32 | 33 | let ut = ""; 43 | $("#merke").html(ut); 44 | 45 | addEventListeners(biler); 46 | } 47 | 48 | const addEventListeners = biler => { 49 | for (const bil of biler) $("#valgtMerke").on("change", () => finnTyper()); 50 | } 51 | 52 | const finnTyper = () => { 53 | const valgtMerke = $("#valgtMerke").val(); 54 | $.get(api + "/hentBiler", biler => formaterTyper(biler, valgtMerke)) 55 | .fail(jqXHR => { 56 | const json = $.parseJSON(jqXHR.responseText); 57 | $("#feil").html(json.message); 58 | }); 59 | } 60 | 61 | const formaterTyper = (biler, valgtMerke) => { 62 | let ut = ""; 69 | $("#type").html(ut); 70 | } -------------------------------------------------------------------------------- /src/main/resources/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Web programming spring 6 | 7 | 8 | 9 |

Web programming spring - Hovedmeny

10 |

Moduler

11 |
    12 | 13 |
  1. Introduksjon
  2. 14 |
    15 | 16 |
  3. JavaScript1
  4. 17 |
    18 | 19 |
  5. JavaScript2
  6. 20 |
    21 | 22 |
  7. JavaScript3
  8. 23 |
    24 | 25 |
  9. jQuery
  10. 26 |
    27 |
  11. Introduksjon til klient/tjener (Spring)
  12. 28 | 39 | 40 |
  13. Lagring av data på server i ArrayList
  14. 41 |
    42 | 43 |
  15. Styling med bootstrap
  16. 44 |
    45 | 46 |
  17. Bruk av nedtrekkslister, radioknapper og avhukingsbokser mot tjener/server
  18. 47 |
    48 | 49 |
  19. Rekursjon --> Tower of Hanoi
  20. 50 |
    51 |
  21. Datastrkturer
  22. 52 |
  23. Generiske datatyper
  24. 53 | 54 |
  25. Relasjonsdatabase 1
  26. 55 |
    56 | 57 |
  27. Relasjonsdatabase 2
  28. 58 |
    59 | 60 |
  29. Inputvalidering på klient og server
  30. 61 |
    62 | 63 |
  31. Sesjoner (Brukernavn: Admin, Passord: Admin1234)
  32. 64 |
    65 | 66 |
  33. Sikkerhet (Brukernavn: Admin, Passord: Admin1234)
  34. 67 |
    68 |
69 | 70 | -------------------------------------------------------------------------------- /src/main/resources/static/relasjonsdatabase2/index.js: -------------------------------------------------------------------------------- 1 | import {apiRelasjonsdatabase2 as api} from "../apiurl.js" 2 | 3 | $(() => { // kjøres når dokumentet er ferdig lastet 4 | hentAlle(); 5 | 6 | $("#slettAlle").click(() => { 7 | $.ajax(api + "/slettAlle", { 8 | type: 'DELETE', 9 | success: () => hentAlle(), 10 | error: (jqXhr, textStatus, errorMessage) => console.log(errorMessage) 11 | }); 12 | }); 13 | }); 14 | 15 | const hentAlle = () => { 16 | $.get(api + "/hentAlle", biler => formaterData(biler)) 17 | .fail(jqXHR => { 18 | const json = $.parseJSON(jqXHR.responseText); 19 | $("#feil").html(json.message); 20 | }); 21 | } 22 | 23 | const formaterData = biler => { 24 | 25 | $(".car").off() //Fjerner eventlisteners på alle car objekter 26 | 27 | let ut = "" + 28 | ""; 29 | for (const bil of biler) { 30 | ut += "" + 31 | "" + 32 | "" + 33 | "" + 34 | ""; 35 | } 36 | 37 | ut += "
PersonnrNavnAdresseKjennetegnMerkeType
" + bil.personnr + "" + bil.navn + "" + bil.adresse + "" + bil.kjennetegn + "" + bil.merke + "" + bil.type + "
"; 38 | $("#bilene").html(ut); 39 | 40 | addEventListeners(biler); 41 | } 42 | 43 | const addEventListeners = biler => { 44 | for (const {personnr, id} of biler) { 45 | $("#" + personnr).on("click", () => slettEnMotorvogn(personnr)); 46 | $("#" + id).on("click", () => idTilEndring(id)); 47 | } 48 | } 49 | 50 | const idTilEndring = id => window.location.href = "/relasjonsdatabase2/endre.html?" + id; 51 | 52 | const slettEnMotorvogn = personnr => { 53 | const url = "/slettEnMotorvogn?personnr=" + personnr; 54 | $.ajax(api + url, { 55 | type: 'DELETE', 56 | success: () => window.location.href = "/relasjonsdatabase2/index.html", 57 | error: (jqXhr, textStatus, errorMessage) => console.log(errorMessage) 58 | }); 59 | } -------------------------------------------------------------------------------- /src/main/resources/static/inputvalidering/validering.js: -------------------------------------------------------------------------------- 1 | const validerPersonnr = () => { 2 | const personnr = $("#personnr").val(); 3 | const regexp = /^[0-9]{11}$/; 4 | const ok = regexp.test(personnr); 5 | if (!ok) { 6 | $("#feilPersonnummer").html("Personnummeret må bestå av 11 siffer"); 7 | return false; 8 | } else { 9 | $("#feilPersonnummer").html(""); 10 | return true; 11 | } 12 | } 13 | 14 | const validerNavn = () => { 15 | const navn = $("#navn").val(); 16 | const regexp = /^[a-zA-ZæøåÆØÅ. \-]{2,20}$/; 17 | const ok = regexp.test(navn); 18 | if (!ok) { 19 | $("#feilNavn").html("Navnet må bestå av 2 til 20 bokstaver"); 20 | return false; 21 | } else { 22 | $("#feilNavn").html(""); 23 | return true; 24 | } 25 | } 26 | 27 | const validerAdresse = () => { 28 | const adresse = $("#adresse").val(); 29 | const regexp = /[0-9a-zA-ZæøåÆØÅ. \-]{2,30}$/; 30 | const ok = regexp.test(adresse); 31 | if (!ok) { 32 | $("#feilAdresse").html("Adressen må bestå av 2 til 40 bokstaver og tall"); 33 | return false; 34 | } else { 35 | $("#feilAdresse").html(""); 36 | return true; 37 | } 38 | } 39 | 40 | const validerKjennetegn = () => { 41 | const kjennetegn = $("#kjennetegn").val(); 42 | const regexp = /^[A-Z][A-Z][0-9]{5}$/; 43 | const ok = regexp.test(kjennetegn); 44 | if (!ok) { 45 | $("#feilKjennetegn").html("Kjennetegnet må ha to store bokstaver og 5 tall"); 46 | return false; 47 | } else { 48 | $("#feilKjennetegn").html(""); 49 | return true; 50 | } 51 | } 52 | 53 | const validerMerke = () => { 54 | const merke = $("#valgtMerke").val(); 55 | if (merke === "Velg merke") { 56 | $("#feilMerke").html("Velg et merke!"); 57 | return false; 58 | } else { 59 | $("#feilMerke").html(""); 60 | return true; 61 | } 62 | } 63 | 64 | const ingenValideringsFeil = () => { 65 | return (validerPersonnr() && validerNavn() && validerAdresse() && validerKjennetegn() && validerMerke()); 66 | } 67 | 68 | export default { 69 | personnr: validerPersonnr, 70 | navn: validerNavn, 71 | adresse: validerAdresse, 72 | kjennetegn: validerKjennetegn, 73 | feil: ingenValideringsFeil 74 | } 75 | -------------------------------------------------------------------------------- /src/main/resources/static/stylingbootstrap/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Motorvognregister 1 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 |

Motorvognregister

15 |
16 |
17 | 18 | 19 |
20 |
21 | 22 | 23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 35 |
36 |
37 | 38 | 39 |
40 |
41 | 42 |
43 |
44 |
45 |

Alle bilene:

46 |
47 | 48 |
49 |
50 |
51 | 52 | -------------------------------------------------------------------------------- /src/main/resources/static/relasjonsdatabase1/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
12 |
13 |
14 |

Motorvognregister

15 |
16 |
17 | 18 | 19 |
20 |
21 | 22 | 23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 37 |
38 |
39 | 40 | 43 |
44 |
45 | 46 |
47 |
48 |
49 |

Alle bilene:

50 |
51 | 52 |
53 |
54 |
55 | 56 | -------------------------------------------------------------------------------- /src/main/resources/templates/error.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | OppgLfWebProgV21 9 | 10 | 11 | 12 |

OppgLfWebProgV21 - Hovedmeny

13 |

Moduler

14 |
    15 | 16 |
  1. Introduksjon
  2. 17 |
    18 | 19 |
  3. JavaScript1
  4. 20 |
    21 | 22 |
  5. JavaScript2
  6. 23 |
    24 | 25 |
  7. JavaScript3
  8. 26 |
    27 | 28 |
  9. jQuery
  10. 29 |
    30 |
  11. Introduksjon til klient/tjener (Spring)
  12. 31 | 42 | 43 |
  13. Lagring av data på server i ArrayList
  14. 44 |
    45 | 46 |
  15. Styling med bootstrap
  16. 47 |
    48 | 49 |
  17. Bruk av nedtrekkslister, radioknapper og avhukingsbokser mot tjener/server
  18. 50 |
    51 | 52 |
  19. Rekursjon --> Tower of Hanoi
  20. 53 |
    54 |
  21. Datastrkturer
  22. 55 |
  23. Generiske datatyper
  24. 56 | 57 |
  25. Relasjonsdatabase 1
  26. 58 |
    59 | 60 |
  27. Relasjonsdatabase 2
  28. 61 |
    62 | 63 |
  29. Inputvalidering på klient og server
  30. 64 |
    65 | 66 |
  31. Sesjoner (Brukernavn: Admin, Passord: Admin1234)
  32. 67 |
    68 | 69 |
  33. Sikkerhet (Brukernavn: Admin, Passord: Admin1234)
  34. 70 |
    71 |
72 | 73 | -------------------------------------------------------------------------------- /src/main/resources/static/nedtrekkslister/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Motorvognregister 1 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 |

Motorvognregister

15 |
16 |
17 | 18 | 19 |
20 |
21 | 22 | 23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 37 |
38 |
39 | 40 | 43 |
44 |
45 | 46 |
47 |
48 |
49 |

Alle bilene:

50 |
51 | 52 |
53 |
54 |
55 | 56 | -------------------------------------------------------------------------------- /src/main/resources/static/jQuery/jquery.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | jQuery 6 | 7 | 8 | 9 | 10 |

Oppgave 1

11 | Navn: 12 | Alder: 13 | 14 |
15 | 16 |

Oppgave 2

17 | Fahrenheit: 19 | Celsius: 21 | 22 |

Oppgave 3

23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |

Oppgave 4

32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 49 | 50 |
Navn
Adresse
Telefonnr
47 | 48 |
51 |
52 | 53 |

Ekstraoppgaver

54 |

Oppgave 5

55 | 56 | 57 |

Gjøremål

58 |
    59 | 60 |

    Oppgave 6

    61 | 62 | 63 | 64 |

    Gjøremål

    65 |
      66 |
        67 | 68 |

        Oppgave 7

        69 | 70 |
          71 | 72 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/ovinger/Liste.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.ovinger; 2 | 3 | /** 4 | * Denne koden er ikke perfekt og har sine mangler og feil. 5 | * Koden ble skrevet for å forklare prinsippet med noder fremfor indekser i et array. 6 | * Mer komplette datastrukturer ligger i pakken/mappen 'datastrukturer' 7 | */ 8 | 9 | public class Liste { 10 | private static class Node { 11 | int verdi; 12 | Node neste; 13 | 14 | public Node(int verdi) { 15 | this.verdi = verdi; 16 | } 17 | } 18 | 19 | private Node hode = null; 20 | private Node hale = null; 21 | 22 | public void settInn(int tall) { 23 | Node node = new Node(tall); 24 | 25 | if (hode == null) { 26 | hode = node; 27 | hale = hode; 28 | } else { 29 | hale.neste = node; 30 | hale = hale.neste; 31 | } 32 | } 33 | 34 | public void slettNode(int tall) { 35 | if (!finn(tall)) return; 36 | 37 | Node start = hode; 38 | Node forrige = null; 39 | 40 | if (start == null) return; 41 | 42 | do { 43 | if (start.verdi == tall) { 44 | assert forrige != null; 45 | forrige.neste = start.neste; 46 | start.neste = null; 47 | break; 48 | } 49 | forrige = start; 50 | start = start.neste; 51 | } while (start != null); 52 | } 53 | 54 | public boolean finn(int verdi) { 55 | Node start = hode; 56 | 57 | do { 58 | if (start.verdi == verdi) { 59 | return true; 60 | } 61 | start = start.neste; 62 | } while (start != null); 63 | 64 | return false; 65 | } 66 | 67 | public int antall() { 68 | int teller = 0; 69 | Node node = hode; 70 | 71 | if (node == null) { 72 | return teller; 73 | } 74 | do { 75 | teller++; 76 | node = node.neste; 77 | } while (node != null); 78 | 79 | return teller; 80 | } 81 | 82 | 83 | public void skrivUt() { 84 | Node start = hode; 85 | if (hode == null) { 86 | return; 87 | } 88 | do { 89 | System.out.print(start.verdi + " "); 90 | start = start.neste; 91 | } while (start != null); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/datastrukturer/SirkelLinketListe.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.datastrukturer; 2 | 3 | public class SirkelLinketListe { 4 | private static class Node { 5 | private final int verdi; 6 | private Node neste; 7 | 8 | public Node(int verdi) { 9 | this.verdi = verdi; 10 | } 11 | } 12 | 13 | private Node hode; 14 | private Node hale; 15 | 16 | public SirkelLinketListe() { 17 | this.hode = null; 18 | this.hale = null; 19 | } 20 | 21 | public void leggTilNode(int verdi){ 22 | Node node = new Node(verdi); 23 | 24 | if (hode == null){ 25 | hode = node; 26 | }else { 27 | hale.neste = node; 28 | } 29 | 30 | hale = node; 31 | hale.neste = hode; 32 | } 33 | 34 | public boolean inneholderNode(int verdi){ 35 | Node start = hode; 36 | 37 | if (hode != null){ 38 | do { 39 | if (start.verdi == verdi){ 40 | return true; 41 | } 42 | start = start.neste; 43 | }while (start != hode); 44 | } 45 | return false; 46 | } 47 | 48 | public void slettNode(int verdi){ 49 | Node currentNode = hode; 50 | 51 | if (hode != null){ 52 | do { 53 | Node nextNode = currentNode.neste; 54 | if (nextNode.verdi == verdi){ 55 | if (hode == hale){ 56 | hode = null; 57 | hale = null; 58 | }else { 59 | currentNode.neste = nextNode.neste; 60 | if (hode == nextNode){ 61 | hode = hode.neste; 62 | } 63 | if (hale == nextNode){ 64 | hale = currentNode; 65 | } 66 | } 67 | break; 68 | } 69 | currentNode = nextNode; 70 | }while (currentNode != hode); 71 | } 72 | } 73 | 74 | public void skrivUt(){ 75 | Node current = hode; 76 | 77 | if (hode != null){ 78 | do { 79 | System.out.print(current.verdi + " "); 80 | current = current.neste; 81 | }while (current != hode); 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/registrere.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
          12 |
          13 |
          14 |

          Motorvognregister

          15 |
          16 |
          17 | 18 | 19 | 20 |
          21 |
          22 | 23 | 24 | 25 |
          26 |
          27 | 28 | 29 | 30 |
          31 |
          32 | 33 | 34 | 35 |
          36 |
          37 | 38 | 41 | 42 |
          43 |
          44 | 45 | 48 |
          49 |
          50 | 51 |
          52 |
          53 |
          54 |
          55 |
          56 | 57 | -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/registrere.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
          12 |
          13 |
          14 |

          Motorvognregister

          15 |
          16 |
          17 | 18 | 19 | 20 |
          21 |
          22 | 23 | 24 | 25 |
          26 |
          27 | 28 | 29 | 30 |
          31 |
          32 | 33 | 34 | 35 |
          36 |
          37 | 38 | 41 | 42 |
          43 |
          44 | 45 | 48 |
          49 |
          50 | 51 |
          52 |
          53 |
          54 |
          55 |
          56 | 57 | -------------------------------------------------------------------------------- /src/main/resources/static/javascript3/js3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 |

          Oppgave 1

          9 | Navn: 10 | Alder: 11 | 12 |
          13 | 14 |

          Oppgave 2

          15 | Fahrenheit: 17 | Celsius: 19 | 20 |

          Oppgave 3

          21 | 22 | 23 | 24 | 25 | 26 | 27 |
          28 | 29 |

          Oppgave 4

          30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 47 | 48 |
          Navn
          Adresse
          Telefonnr
          45 | 46 |
          49 |
          50 | 51 |

          Ekstraoppgaver

          52 |

          Oppgave 5

          53 | 54 | 55 |

          Gjøremål

          56 |
            57 | 58 |

            Oppgave 6

            59 | 60 | 61 | 62 |

            Gjøremål

            63 |
              64 |
                65 | 66 |

                Oppgave 7

                67 | 68 |
                  69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/datastrukturer/LenketListe.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.datastrukturer; 2 | 3 | import java.util.LinkedList; 4 | 5 | public class LenketListe { 6 | 7 | public Node hode; 8 | public Node hale; 9 | 10 | public LenketListe() { 11 | hode = hale = null; 12 | } 13 | 14 | static final class Node { 15 | String navn; 16 | Node forrige; 17 | Node neste; 18 | 19 | public Node(String navn) { 20 | this.navn = navn; 21 | } 22 | 23 | public Node(Node forrige, Node neste) { 24 | this.forrige = forrige; 25 | this.neste = neste; 26 | } 27 | } 28 | 29 | //Veldig forenklet metode 30 | public void add(String navn) { 31 | Node node = new Node(navn); 32 | if (hale == null) { 33 | hale = hode = node; 34 | } 35 | hale.neste = node; 36 | node.forrige = hale; 37 | hale = node; 38 | } 39 | 40 | public void slett(String navn) { 41 | Node node = hode; 42 | while (node != null) { 43 | if (node.navn.equals(navn)) { 44 | if (node == hode) { 45 | node.neste.forrige = null; 46 | hode = node.neste; 47 | } else if (node == hale) { 48 | node.forrige.neste = null; 49 | hale = node.forrige; 50 | } else { 51 | node.neste.forrige = node.forrige; 52 | node.forrige.neste = node.neste; 53 | } 54 | } 55 | node = node.neste; 56 | } 57 | } 58 | 59 | @Override 60 | public String toString() { 61 | StringBuilder msg = new StringBuilder(); 62 | 63 | Node node = hode; 64 | 65 | while (node != null) { 66 | msg.append(node.navn).append(" "); 67 | node = node.neste; 68 | } 69 | 70 | return msg.toString(); 71 | } 72 | } 73 | 74 | class Main { 75 | public static void main(String[] args) { 76 | LinkedList linkedList = new LinkedList<>(); 77 | linkedList.add("Petter"); 78 | linkedList.add("Nina"); 79 | System.out.println(linkedList); 80 | 81 | LenketListe liste = new LenketListe(); 82 | liste.add("Erik"); 83 | liste.add("Lisa"); 84 | liste.add("Ali"); 85 | 86 | System.out.println(liste); 87 | 88 | liste.slett("Ali"); 89 | 90 | System.out.println(liste); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/endre.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
                  12 |
                  13 |
                  14 |

                  Motorvognregister

                  15 |
                  16 | 17 |
                  18 | 19 | 20 | 21 |
                  22 |
                  23 | 24 | 25 | 26 |
                  27 |
                  28 | 29 | 30 | 31 |
                  32 |
                  33 | 34 | 35 | 36 |
                  37 |
                  38 | 39 | 42 | 43 |
                  44 |
                  45 | 46 | 49 | 50 |
                  51 |
                  52 | 53 |
                  54 |
                  55 |
                  56 |
                  57 |
                  58 | 59 | -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/endre.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
                  12 |
                  13 |
                  14 |

                  Motorvognregister

                  15 |
                  16 | 17 |
                  18 | 19 | 20 | 21 |
                  22 |
                  23 | 24 | 25 | 26 |
                  27 |
                  28 | 29 | 30 | 31 |
                  32 |
                  33 | 34 | 35 | 36 |
                  37 |
                  38 | 39 | 42 | 43 |
                  44 |
                  45 | 46 | 49 | 50 |
                  51 |
                  52 | 53 |
                  54 |
                  55 |
                  56 |
                  57 |
                  58 | 59 | -------------------------------------------------------------------------------- /src/main/resources/static/lagringserver/index.js: -------------------------------------------------------------------------------- 1 | import { apiLagringServer as api} from "../apiurl.js" 2 | 3 | $(() => { 4 | $("#regMotorvogn").click(() => { 5 | const personnr = $("#personnr"); 6 | const navn = $("#navn"); 7 | const adresse = $("#adresse"); 8 | const kjennetegn = $("#kjennetegn"); 9 | const merke = $("#merke"); 10 | const type = $("#type"); 11 | 12 | const motorvogn = { 13 | personnr: personnr.val(), 14 | navn: navn.val(), 15 | adresse: adresse.val(), 16 | kjennetegn: kjennetegn.val(), 17 | merke: merke.val(), 18 | type: type.val() 19 | }; 20 | 21 | if (inputval(motorvogn)) { 22 | $.post(api + "/motor", motorvogn, () => hent()); 23 | /* 24 | $.post("/lagre", motorvogn, function (){ 25 | $.get("/hentAlle", function (biler) { 26 | formater(biler); 27 | }); 28 | }); 29 | */ 30 | personnr.val(""); 31 | navn.val(""); 32 | adresse.val(""); 33 | kjennetegn.val(""); 34 | merke.val(""); 35 | type.val(""); 36 | } else { 37 | console.log("Mangler input"); 38 | } 39 | }); 40 | 41 | $("#slettAlle").click(() => { 42 | $.ajax(api + "/motor", { 43 | type: 'DELETE', 44 | success: () => hent(), 45 | error: (jqXhr, textStatus, errorMessage) => console.log(errorMessage) 46 | }); 47 | }); 48 | }); 49 | 50 | const hent = () => $.get(api + "/motor", biler => formater(biler)); 51 | 52 | const inputval = motorvogn => { 53 | if (motorvogn.personnr === "") return false 54 | else if (motorvogn.navn === "") return false 55 | else if (motorvogn.adresse === "") return false 56 | else if (motorvogn.kjennetegn === "") return false 57 | else if (motorvogn.merke === "") return false 58 | else return motorvogn.type !== ""; 59 | } 60 | 61 | const formater = biler => { 62 | let ut = "" + 63 | ""; 64 | 65 | for (let bil of biler) { 66 | ut += "" + 67 | ""; 68 | } 69 | 70 | ut += "
                  PersonnrNavnAdresseKjennetegnMerkeType
                  " + bil.personnr + "" + bil.navn + "" + bil.adresse + "" + bil.kjennetegn + "" + bil.merke + "" + bil.type + "
                  "; 71 | 72 | $("#bilene").html(ut); 73 | } 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /src/main/resources/static/inputvalidering/registrere.js: -------------------------------------------------------------------------------- 1 | import { apiInputvalidering as api} from "../apiurl.js" 2 | import validering from "./validering.js"; 3 | 4 | $(() => { // kjøres når dokumentet er ferdig lastet 5 | hentAlleBiler(); 6 | 7 | $("#regMotorvogn").click(() => { 8 | const motorvogn = { 9 | personnr: $("#personnr").val(), 10 | navn: $("#navn").val(), 11 | adresse: $("#adresse").val(), 12 | kjennetegn: $("#kjennetegn").val(), 13 | merke: $("#valgtMerke").val(), 14 | type: $("#valgtType").val(), 15 | }; 16 | 17 | if (validering.feil()) { 18 | $.post(api + "/lagre", motorvogn, () => hentAlleBiler()); 19 | 20 | window.location.href = "/inputvalidering/index.html"; 21 | } 22 | }); 23 | 24 | $("#personnr").on("change", () => validering.personnr()); 25 | $("#navn").on("change", () => validering.navn()); 26 | $("#adresse").on("change", () => validering.adresse()); 27 | $("#kjennetegn").on("change", () => validering.kjennetegn()); 28 | 29 | }); 30 | 31 | const hentAlleBiler = () => { 32 | $.get(api + "/hentBiler", biler => formaterBiler(biler)) 33 | .fail(jqXHR => { 34 | const json = $.parseJSON(jqXHR.responseText); 35 | $("#feil").html(json.message); 36 | }); 37 | } 38 | 39 | const formaterBiler = biler => { 40 | $("#valgtMerke").off(); 41 | let ut = ""; 51 | $("#merke").html(ut); 52 | 53 | addEventListeners(biler) 54 | } 55 | 56 | const addEventListeners = biler => { 57 | for (const bil of biler) $("#valgtMerke").on("change", () => finnTyper()); 58 | } 59 | 60 | const finnTyper = () => { 61 | const valgtMerke = $("#valgtMerke").val(); 62 | $("#feilMerke").html(""); 63 | $.get(api + "/hentBiler", biler => formaterTyper(biler, valgtMerke)) 64 | .fail(jqXHR => { 65 | const json = $.parseJSON(jqXHR.responseText); 66 | $("#feil").html(json.message); 67 | }); 68 | } 69 | 70 | const formaterTyper = (biler, valgtMerke) => { 71 | let ut = ""; 78 | $("#type").html(ut); 79 | } -------------------------------------------------------------------------------- /src/main/resources/static/inputvalidering/endre.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Motorvognregister 9 | 10 | 11 |
                  12 |
                  13 |
                  14 |

                  Motorvognregister

                  15 |
                  16 | 17 |
                  18 | 19 | 20 | 21 |
                  22 |
                  23 | 24 | 25 | 26 |
                  27 |
                  28 | 29 | 30 | 31 |
                  32 |
                  33 | 34 | 35 | 36 |
                  37 |
                  38 | 39 | 42 | 43 |
                  44 |
                  45 | 46 | 49 | 50 |
                  51 |
                  52 |
                  53 |
                  54 |
                  55 |
                  56 |
                  57 | 58 | -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/registrere.js: -------------------------------------------------------------------------------- 1 | import {apiSesjoner as api} from "../apiurl.js" 2 | import validering from "./validering.js" 3 | 4 | $(() => { // kjøres når dokumentet er ferdig lastet 5 | hentAlleBiler(); 6 | 7 | $("#regMotorvogn").click(() => { 8 | const motorvogn = { 9 | personnr: $("#personnr").val(), 10 | navn: $("#navn").val(), 11 | adresse: $("#adresse").val(), 12 | kjennetegn: $("#kjennetegn").val(), 13 | merke: $("#valgtMerke").val(), 14 | type: $("#valgtType").val(), 15 | }; 16 | 17 | if (validering.ingenfeil()) { 18 | $.post(api + "/lagre", motorvogn, () => { 19 | window.location.href = "/sesjoner/liste.html"; 20 | }); 21 | } 22 | }) 23 | 24 | $("#personnr").on("change", () => validering.personnr()); 25 | $("#navn").on("change", () => validering.navn()); 26 | $("#adresse").on("change", () => validering.adresse()); 27 | $("#kjennetegn").on("change", () => validering.kjennetegn()); 28 | }); 29 | 30 | const hentAlleBiler = () => { 31 | $.get(api + "/hentBiler", biler => { 32 | formaterBiler(biler); 33 | }) 34 | .fail(jqXHR => { 35 | const json = $.parseJSON(jqXHR.responseText); 36 | $("#feil").html(json.message); 37 | }); 38 | } 39 | 40 | const formaterBiler = biler => { 41 | $("#valgtMerke").off(); 42 | let ut = ""; 52 | $("#merke").html(ut); 53 | 54 | addEventListeners(biler) 55 | } 56 | 57 | const addEventListeners = biler => { 58 | for (const bil of biler) $("#valgtMerke").on("change", () => finnTyper()); 59 | } 60 | 61 | const finnTyper = () => { 62 | const valgtMerke = $("#valgtMerke").val(); 63 | $("#feilMerke").html(""); 64 | $.get(api + "/hentBiler", biler => { 65 | formaterTyper(biler, valgtMerke); 66 | }) 67 | .fail(jqXHR => { 68 | const json = $.parseJSON(jqXHR.responseText); 69 | $("#feil").html(json.message); 70 | }); 71 | } 72 | 73 | const formaterTyper = (biler, valgtMerke) => { 74 | let ut = ""; 81 | $("#type").html(ut); 82 | } -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/registrere.js: -------------------------------------------------------------------------------- 1 | import validering from "./validering.js" 2 | import {apiSikkerhet as api} from "../apiurl.js" 3 | 4 | $(() => { // kjøres når dokumentet er ferdig lastet 5 | hentAlleBiler(); 6 | 7 | $("#regMotorvogn").click(() => { 8 | const motorvogn = { 9 | personnr: $("#personnr").val(), 10 | navn: $("#navn").val(), 11 | adresse: $("#adresse").val(), 12 | kjennetegn: $("#kjennetegn").val(), 13 | merke: $("#valgtMerke").val(), 14 | type: $("#valgtType").val(), 15 | }; 16 | 17 | if (validering.ingenfeil()) { 18 | $.post(api + "/lagre", motorvogn, () => { 19 | window.location.href = "/sikkerhet/liste.html"; 20 | }); 21 | } 22 | }) 23 | 24 | $("#personnr").on("change", () => validering.personnr()); 25 | $("#navn").on("change", () => validering.navn()); 26 | $("#adresse").on("change", () => validering.adresse()); 27 | $("#kjennetegn").on("change", () => validering.kjennetegn()); 28 | }); 29 | 30 | const hentAlleBiler = () => { 31 | $.get(api + "/hentBiler", biler => { 32 | formaterBiler(biler); 33 | }) 34 | .fail(jqXHR => { 35 | const json = $.parseJSON(jqXHR.responseText); 36 | $("#feil").html(json.message); 37 | }); 38 | } 39 | 40 | const formaterBiler = biler => { 41 | $("#valgtMerke").off(); 42 | let ut = ""; 52 | $("#merke").html(ut); 53 | 54 | addEventListeners(biler) 55 | } 56 | 57 | const addEventListeners = biler => { 58 | for (const bil of biler) $("#valgtMerke").on("change", () => finnTyper()); 59 | } 60 | 61 | const finnTyper = () => { 62 | const valgtMerke = $("#valgtMerke").val(); 63 | $("#feilMerke").html(""); 64 | $.get(api + "/hentBiler", biler => { 65 | formaterTyper(biler, valgtMerke); 66 | }) 67 | .fail(jqXHR => { 68 | const json = $.parseJSON(jqXHR.responseText); 69 | $("#feil").html(json.message); 70 | }); 71 | } 72 | 73 | const formaterTyper = (biler, valgtMerke) => { 74 | let ut = ""; 81 | $("#type").html(ut); 82 | } 83 | 84 | 85 | -------------------------------------------------------------------------------- /src/main/resources/static/stylingbootstrap/index.js: -------------------------------------------------------------------------------- 1 | import { apiLagringServer as api} from "../apiurl.js" 2 | 3 | $(() => { 4 | $("#regMotorvogn").click(() => { 5 | const personnr = $("#personnr"); 6 | const navn = $("#navn"); 7 | const adresse = $("#adresse"); 8 | const kjennetegn = $("#kjennetegn"); 9 | const merke = $("#merke"); 10 | const type = $("#type"); 11 | 12 | const motorvogn = { 13 | personnr: personnr.val(), 14 | navn: navn.val(), 15 | adresse: adresse.val(), 16 | kjennetegn: kjennetegn.val(), 17 | merke: merke.val(), 18 | type: type.val() 19 | }; 20 | 21 | if (inputval(motorvogn)) { 22 | $.post(api + "/motor", motorvogn, () => hent()); 23 | /* 24 | $.post("/lagre", motorvogn, function (){ 25 | $.get("/hentAlle", function (biler) { 26 | formater(biler); 27 | }); 28 | }); 29 | */ 30 | personnr.val(""); 31 | navn.val(""); 32 | adresse.val(""); 33 | kjennetegn.val(""); 34 | merke.val(""); 35 | type.val(""); 36 | } else { 37 | console.log("Mangler input"); 38 | } 39 | }); 40 | 41 | $("#slettAlle").click(() => { 42 | $.ajax(api + "/motor", { 43 | type: 'DELETE', 44 | success: () => hent(), 45 | error: (jqXhr, textStatus, errorMessage) => console.log(errorMessage) 46 | }); 47 | }); 48 | }); 49 | 50 | const hent = () => $.get(api + "/motor", biler => formater(biler)); 51 | 52 | const inputval = motorvogn => { 53 | if (motorvogn.personnr === "") return false 54 | else if (motorvogn.navn === "") return false 55 | else if (motorvogn.adresse === "") return false 56 | else if (motorvogn.kjennetegn === "") return false 57 | else if (motorvogn.merke === "") return false 58 | else return motorvogn.type !== ""; 59 | } 60 | 61 | const formater = biler => { 62 | let ut = ` 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | ${biler.map(bil => { 73 | return ` 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | ` 82 | })} 83 |
                  PersonnrNavnAdresseKjennetegnMerkeType
                  ${bil.personnr}${bil.navn}${bil.adresse}${bil.kjennetegn}${bil.merke}${bil.type}
                  84 | ` 85 | $("#bilene").html(ut); 86 | } -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/eksamen/v20/ControllerV20.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.eksamen.v20; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.jdbc.core.JdbcTemplate; 7 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | import javax.servlet.http.HttpSession; 11 | import java.util.List; 12 | 13 | @RestController 14 | @SuppressWarnings("all") 15 | @RequestMapping("/api/eksamen/v20/") 16 | public class ControllerV20 { 17 | 18 | @Autowired 19 | HttpSession session; 20 | 21 | @Autowired 22 | private JdbcTemplate db; 23 | 24 | private final Logger logger = LoggerFactory.getLogger(ControllerV20.class); 25 | 26 | @PostMapping("/langrenn") 27 | public boolean lagre(Skiloper skiloper) { 28 | try { 29 | String kryptert = krypterPassord(skiloper.getPassord()); 30 | 31 | String SQL = "INSERT INTO utover(fornavn,etternavn,klubb,epost,passord) VALUES(?,?,?,?,?)"; 32 | db.update(SQL, skiloper.getFornavn(), 33 | skiloper.getEtternavn(), 34 | skiloper.getKlubb(), 35 | skiloper.getEpost(), 36 | kryptert); 37 | 38 | return true; 39 | } catch (Exception e) { 40 | System.err.println("Feil i insetting i database"); 41 | return false; 42 | } 43 | } 44 | 45 | @GetMapping("/langrenn") 46 | public List hent() { 47 | return null; 48 | } 49 | 50 | @DeleteMapping("/langrenn") 51 | public void slett() { 52 | 53 | } 54 | 55 | @PostMapping("/logginn") 56 | public boolean logginn(Bruker bruker) { 57 | if (validerBruker(bruker.getEpost(), bruker.getPassord())) { 58 | session.setAttribute("loggetinn", true); 59 | return true; 60 | } else { 61 | logger.error("Feil i validering av brukernavn eller passord"); 62 | return false; 63 | } 64 | } 65 | 66 | @GetMapping("/logginn") 67 | public boolean logginnfrafor() { 68 | return (boolean) session.getAttribute("loggetinn"); 69 | } 70 | 71 | private String krypterPassord(String passord) { 72 | BCryptPasswordEncoder bCrypt = new BCryptPasswordEncoder(15); 73 | return bCrypt.encode(passord); 74 | } 75 | 76 | private boolean validerBruker(String epost, String passord) { 77 | String regExEpost = "a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}"; 78 | String regExPassord = "(?=.*[A-ZÆØÅa-zæøå])(?=.*\\d)[A-ZÆØÅa-zæøå\\d]{6,} "; 79 | 80 | if (epost.matches(regExEpost) && passord.matches(regExPassord)) { 81 | return true; 82 | } else { 83 | return false; 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Web programming spring 2 | 3 | Løsningsforsalg/hjelp til oppgaver 4 | i [DATA1700-1 21V Webprogrammering](https://student.oslomet.no/studier/-/studieinfo/emne/DATA1700/2020/HØST) ved OsloMet 5 | 6 | Deployering av repo: https://oppglfwebprogv21.herokuapp.com 7 | 8 | Klient (frontend) kode ligger i 9 | mappen [/src/main/resources/static/](https://github.com/erikssommer/OppgLfWebProgV21/tree/master/src/main/resources/static) 10 |
                  11 | Tjener/server (backend) kode ligger i 12 | mappen [/src/main/java/](https://github.com/erikssommer/OppgLfWebProgV21/tree/master/src/main/java) 13 | 14 | ## Emnesammendrag 📝 15 | 16 | 1. Introduksjon 🕹 17 | - Bli kjent med IDE, laste ned jdk 18 | - Opprette nytt Spring Initializr prosjekt 19 | - HalloVerden program i javascript 20 | 21 | 2. JavaScript 1 📠 22 | - Funkjsoner og variabler 23 | - Hendelser 24 | - Utskriftsmetoder 25 | 26 | 3. JavaScript 2 🛠 27 | - Løkker 28 | - Arrays 29 | - Objekter 30 | 31 | 4. JavaScript 3 👩‍👧‍👦 32 | - Input 33 | - HTML-kontrollere 34 | - Nedtrekkslister 35 | - Radioknapper 36 | - Avkrysningsbokser 37 | 38 | 5. Introduksjon til jQuery 💰 39 | - Startfunksjonen 40 | - Elementer og hendelser 41 | 42 | 6. Introduksjon til klient/tjener-modellen (Spring) 🛎 43 | - Første tjener program: HelloServer 44 | - Kall/forespørsel fra klient til server og tilbake 45 | - Overføring av objekter 46 | 47 | 7. Mer om HTTP og lagring av data på server 📚 48 | - Post, get, delete (Ajax) 49 | - Objektorientert programmering på server 50 | - Lagring av data i Arraylist i Repository 51 | 52 | 8. Styling med Bootstrap 🎨 53 | - Responsiv grid 54 | - Classes 55 | 56 | 9. Nedtrekkslister, radioknapper og avhuksbokser mot server ☑️ 57 | - Dynamisk bygging av html-elementer med data fra server 58 | 59 | 10. Datastrukturer og rekursjon 🔗 60 | - Enkelt lenket linket liste (LinkedList) 61 | - Sirkulær liste 62 | - Stakk 63 | - Binærsøk 64 | - Basistilfelle for rekursive metoder 65 | - Tårnet i hanoi 66 | 67 | 11. Lagre data på server i en relasjonsdatabase 1 🏟 68 | - H2-database (in memory) 69 | - SQL setninger for insetting, sortering og uttak 70 | 71 | 12. Lagre data på server i en relasjonsdatabase 2 💽 72 | - Feilhåndtering og logging av feilmeldinger 73 | - Flere nyttige SQL-setninger 74 | 75 | 13. Inputvalidering på klinet og tjener/server ✅ 76 | - Bruk og implementering av regex på klinet 77 | - Bruk og implementering av regex på tjener 78 | - Flytte varidering på server ut i service 79 | 80 | 14. Sesjoner 🍪 81 | - "stateless" protokoll 82 | - Http sessions på server 83 | - Generere sessions-ID-er overførte til kilent 84 | - Cookies (informasjonskapsler) 85 | - Timeout 86 | - Innlogging 87 | 88 | 15. Sikkerhet 🔐 89 | - Kryptering av passord 90 | - Dekryptering av passord 91 | - Bruk av spring framework security 92 | - BCrypt 93 | -------------------------------------------------------------------------------- /src/main/resources/static/javascript2/js2.js: -------------------------------------------------------------------------------- 1 | function visPersonRegister() { 2 | const personregister = []; 3 | 4 | const person1 = { 5 | navn: "Åge Pedersen", 6 | adresse: "Å 22", 7 | telefonnr: "29439232" 8 | } 9 | 10 | const person2 = { 11 | navn: "Ole Olsen", 12 | adresse: "Trondheimsvegen 22", 13 | telefonnr: "56789357" 14 | } 15 | 16 | const person3 = { 17 | navn: "Erik Sommer", 18 | adresse: "Lillehammer 22", 19 | telefonnr: "6582384" 20 | } 21 | 22 | const person4 = { 23 | navn: "Amalie Bakken", 24 | adresse: "Bærum 23", 25 | telefonnr: "56789357" 26 | } 27 | 28 | const person5 = { 29 | navn: "Line Nilsen", 30 | adresse: "Osloveien 22", 31 | telefonnr: "43565872" 32 | } 33 | 34 | personregister.push(person1, person2, person3, person4, person5); 35 | 36 | for (let person of personregister) { 37 | console.log(person.navn + " " + person.adresse + " " + person.telefonnr); 38 | } 39 | 40 | console.log(""); 41 | 42 | function compare(a, b) { 43 | if (a.navn < b.navn) { 44 | return -1; 45 | } 46 | 47 | if (a.navn > b.navn) { 48 | return 1; 49 | } 50 | return 0; 51 | } 52 | 53 | const sortertListe = personregister.sort(compare); 54 | 55 | for (let person of sortertListe) { 56 | console.log(person.navn + " " + person.adresse + " " + person.telefonnr); 57 | } 58 | 59 | console.log(""); 60 | 61 | /* 62 | // Egen algoritme for sortering basert på navn. O(n^2) -> lite effektiv når listen med navn blir større. 63 | // Vokser eksponensielt 64 | 65 | for (let i = 0; i < personregister.length; i++) { 66 | for (let j = i + 1; j < personregister.length; j++) { 67 | if (personregister[i].navn > personregister[j].navn) { 68 | let tmp = personregister[i].navn; 69 | personregister[i].navn = personregister[j].navn; 70 | personregister[j].navn = tmp; 71 | } 72 | } 73 | } 74 | */ 75 | 76 | for (let person of personregister) { 77 | console.log(person.navn + " " + person.adresse + " " + person.telefonnr); 78 | } 79 | 80 | console.log(""); 81 | 82 | const regpersonnr = []; 83 | 84 | const personnr1 = { 85 | navn: "Line Nilsen", 86 | adresse: "Osloveien 22", 87 | telefonnr: "43565872", 88 | personnr: "23049858435" 89 | } 90 | 91 | const personnr2 = { 92 | navn: "Ole Olsen", 93 | adresse: "Trondheimsvegen 22", 94 | telefonnr: "56789357", 95 | personnr: "12096654762" 96 | } 97 | 98 | regpersonnr.push(personnr1, personnr2); 99 | 100 | for (let person of regpersonnr) { 101 | if (person.personnr[8] % 2 === 0) { 102 | console.log("Jente: " + person.navn + " " + person.adresse + " " + person.telefonnr); 103 | } 104 | } 105 | 106 | } -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.6.3 9 | 10 | 11 | eriksommer 12 | webprog 13 | 0.0.1-SNAPSHOT 14 | webprog 15 | Project for the class webprogramming at OsloMet 16 | 17 | 18 | 17 19 | 20 | 21 | 22 | 23 | org.springframework.boot 24 | spring-boot-starter-data-rest 25 | 26 | 27 | org.springframework.boot 28 | spring-boot-starter-jdbc 29 | 30 | 31 | org.springframework.boot 32 | spring-boot-starter-web 33 | 34 | 35 | 36 | org.springframework.boot 37 | spring-boot-devtools 38 | runtime 39 | true 40 | 41 | 42 | com.h2database 43 | h2 44 | runtime 45 | 46 | 47 | org.springframework.boot 48 | spring-boot-starter-test 49 | test 50 | 51 | 52 | junit 53 | junit 54 | test 55 | 56 | 57 | org.springframework.boot 58 | spring-boot-starter-data-jpa 59 | 60 | 61 | org.springframework.boot 62 | spring-boot-starter-security 63 | 64 | 65 | org.springframework.boot 66 | spring-boot-starter-thymeleaf 67 | 68 | 69 | 70 | 71 | 72 | 73 | org.springframework.boot 74 | spring-boot-maven-plugin 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/relasjonsdatabase2/controller/Motorvogn6Controller.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.relasjonsdatabase2.controller; 2 | 3 | import eriksommer.webprog.relasjonsdatabase2.repository.Motorvogn6Repository; 4 | import eriksommer.webprog.relasjonsdatabase2.model.Bil; 5 | import eriksommer.webprog.relasjonsdatabase2.model.Motorvogn; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.http.HttpStatus; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | import java.util.List; 13 | 14 | @RestController 15 | @RequestMapping("/api/relasjonsdatabase2/") 16 | public class Motorvogn6Controller { 17 | 18 | @Autowired 19 | private Motorvogn6Repository rep; 20 | 21 | @GetMapping("/hentBiler") 22 | public List hentBiler(HttpServletResponse response) throws IOException { 23 | List alleBiler = rep.hentAlleBiler(); 24 | if (alleBiler == null) { 25 | response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Feil i DB -prøv igjen senere"); 26 | } 27 | return alleBiler; 28 | } 29 | 30 | @PostMapping("/lagre") 31 | public void lagreKunde(Motorvogn motorvogn, HttpServletResponse response) throws IOException { 32 | if (!rep.lagreMotorvogn(motorvogn)) { 33 | response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Feil i DB -prøv igjen senere"); 34 | } 35 | } 36 | 37 | @GetMapping("/hentAlle") 38 | public List hentAlleMotorvogner(HttpServletResponse response) throws IOException { 39 | List alleMotorvogner = rep.hentAlleMotorvogner(); 40 | if (alleMotorvogner == null) { 41 | response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Feil i DB -prøv igjen senere"); 42 | } 43 | return alleMotorvogner; 44 | } 45 | 46 | @GetMapping("/henteEnMotorvogn") 47 | public Motorvogn henteEnMotorvogn(int id, HttpServletResponse response) throws IOException { 48 | Motorvogn enMotorvogn = rep.henteEnMotorvogn(id); 49 | if (enMotorvogn == null) { 50 | response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Feil i DB -prøv igjen senere"); 51 | } 52 | return enMotorvogn; 53 | } 54 | 55 | @PostMapping("/endre") 56 | public void endre(Motorvogn motorvogn, HttpServletResponse response) throws IOException { 57 | if (!rep.endreMotorvogn(motorvogn)) { 58 | response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Feil i DB -prøv igjen senere"); 59 | } 60 | } 61 | 62 | @DeleteMapping("/slettEnMotorvogn") 63 | public void slettEnMotorvogn(int personnr, HttpServletResponse response) throws IOException { 64 | if (!rep.slettEnMotorvogn(personnr)) { 65 | response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Feil i DB -prøv igjen senere"); 66 | } 67 | } 68 | 69 | @DeleteMapping("/slettAlle") 70 | public void slettAlleMotorvogner(HttpServletResponse response) throws IOException { 71 | if (!rep.slettAlleMotorvogner()) { 72 | response.sendError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Feil i DB -prøv igjen senere"); 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /src/main/resources/static/relasjonsdatabase2/endre.js: -------------------------------------------------------------------------------- 1 | import {apiRelasjonsdatabase2 as api} from "../apiurl.js" 2 | 3 | $(() => { // kjøres når dokumentet er ferdig lastet 4 | hentAlleBiler(); 5 | henteEnMotorvogn(); 6 | 7 | $("#endreMotorvogn").click(() => { 8 | const motorvogn = { 9 | id: $("#id").val(), 10 | personnr: $("#personnr").val(), 11 | navn: $("#navn").val(), 12 | adresse: $("#adresse").val(), 13 | kjennetegn: $("#kjennetegn").val(), 14 | merke: $("#valgtMerke").val(), 15 | type: $("#valgtType").val(), 16 | }; 17 | 18 | $.post(api + "/endre", motorvogn, () => hentAlleBiler()) 19 | .fail(jqXHR => { 20 | const json = $.parseJSON(jqXHR.responseText); 21 | $("#feil").html(json.message); 22 | }); 23 | 24 | window.location.href = "/relasjonsdatabase2/index.html"; 25 | }); 26 | }); 27 | 28 | const hentAlleBiler = () => { 29 | $.get(api + "/hentBiler", biler => formaterBiler(biler)) 30 | .fail(jqXHR => { 31 | const json = $.parseJSON(jqXHR.responseText); 32 | $("#feil").html(json.message); 33 | }); 34 | } 35 | 36 | const formaterBiler = biler => { 37 | $("#valgtMerke").off(); 38 | 39 | let ut = ""; 49 | $("#merke").html(ut); 50 | 51 | addEventListeners(biler); 52 | } 53 | 54 | const addEventListeners = biler => { 55 | for (const bil of biler) $("#valgtMerke").on("change", () => finnTyper()); 56 | } 57 | 58 | const finnTyper = () => { 59 | const valgtMerke = $("#valgtMerke").val(); 60 | $.get(api + "/hentBiler", biler => formaterTyper(biler, valgtMerke)) 61 | .fail(jqXHR => { 62 | const json = $.parseJSON(jqXHR.responseText); 63 | $("#feil").html(json.message); 64 | }); 65 | } 66 | 67 | const formaterTyper = (biler, valgtMerke) => { 68 | let ut = ""; 75 | $("#type").html(ut); 76 | } 77 | 78 | const henteEnMotorvogn = () => { 79 | const id = window.location.search.substring(1); // kommer fra kallet i index.js 80 | const url = "/henteEnMotorvogn?id=" + id; 81 | $.get(api + url, enMotorVogn => { 82 | // overfør til input-feltene i skjemaet 83 | $("#id").val(enMotorVogn.id); // må ha med denne for å vite hvilken id 84 | $("#personnr").val(enMotorVogn.personnr); 85 | $("#navn").val(enMotorVogn.navn); 86 | $("#adresse").val(enMotorVogn.adresse); 87 | $("#kjennetegn").val(enMotorVogn.kjennetegn); 88 | $("#merke").val(enMotorVogn.merke); 89 | $("#type").val(enMotorVogn.type); 90 | }) 91 | .fail(jqXHR => { 92 | const json = $.parseJSON(jqXHR.responseText); 93 | $("#feil").html(json.message); 94 | }); 95 | } -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/validering.js: -------------------------------------------------------------------------------- 1 | const validerPersonnr = () => { 2 | const personnr = $("#personnr").val(); 3 | const regexp = /^[0-9]{11}$/; 4 | const ok = regexp.test(personnr); 5 | if (!ok) { 6 | $("#feilPersonnummer").html("Personnummeret må bestå av 11 siffer"); 7 | return false; 8 | } else { 9 | $("#feilPersonnummer").html(""); 10 | return true; 11 | } 12 | } 13 | 14 | const validerNavn = () => { 15 | const navn = $("#navn").val(); 16 | const regexp = /^[a-zA-ZæøåÆØÅ. \-]{2,20}$/; 17 | const ok = regexp.test(navn); 18 | if (!ok) { 19 | $("#feilNavn").html("Navnet må bestå av 2 til 20 bokstaver"); 20 | return false; 21 | } else { 22 | $("#feilNavn").html(""); 23 | return true; 24 | } 25 | } 26 | 27 | const validerAdresse = () => { 28 | const adresse = $("#adresse").val(); 29 | const regexp = /^[0-9a-zA-ZæøåÆØÅ. \-]{2,30}$/; 30 | const ok = regexp.test(adresse); 31 | if (!ok) { 32 | $("#feilAdresse").html("Adressen må bestå av 2 til 40 bokstaver og tall"); 33 | return false; 34 | } else { 35 | $("#feilAdresse").html(""); 36 | return true; 37 | } 38 | } 39 | 40 | const validerKjennetegn = () => { 41 | const kjennetegn = $("#kjennetegn").val(); 42 | const regexp = /^[A-Z][A-Z][0-9]{5}$/; 43 | const ok = regexp.test(kjennetegn); 44 | if (!ok) { 45 | $("#feilKjennetegn").html("Kjennetegnet må ha to store bokstaver og 5 tall"); 46 | return false; 47 | } else { 48 | $("#feilKjennetegn").html(""); 49 | return true; 50 | } 51 | } 52 | 53 | const validerMerke = () => { 54 | const merke = $("#valgtMerke").val(); 55 | if (merke === "Velg merke") { 56 | $("#feilMerke").html("Velg et merke!"); 57 | return false; 58 | } else { 59 | $("#feilMerke").html(""); 60 | return true; 61 | } 62 | } 63 | 64 | const ingenValideringsFeil = () => { 65 | return (validerPersonnr() && validerNavn() && validerAdresse() && validerKjennetegn() && validerMerke()); 66 | } 67 | 68 | const validerBrukernavn = () => { 69 | const brukernavn = $("#brukernavn").val(); 70 | const regexp = /^[a-zA-ZæøåÆØÅ. \-]{2,20}$/; 71 | const ok = regexp.test(brukernavn); 72 | if (!ok) { 73 | $("#feilBrukernavn").html("Navnet må bestå av 2 til 20 bokstaver"); 74 | return false; 75 | } else { 76 | $("#feilBrukernavn").html(""); 77 | return true; 78 | } 79 | } 80 | 81 | const validerPassord = () => { 82 | const passord = $("#passord").val(); 83 | const regexp = /^(?=.*[A-ZÆØÅa-zøæå])(?=.*\d)[A-ZØÆÅa-zøæå\d]{8,}$/; 84 | const ok = regexp.test(passord); 85 | if (!ok) { 86 | $("#feilPassord").html("Passordet må være minimum 8 tegn, minst en bokstav og et tall"); 87 | return false; 88 | } else { 89 | $("#feilPassord").html(""); 90 | return true; 91 | } 92 | } 93 | 94 | const loggInnValideringOK = () => { 95 | return (validerBrukernavn && validerPassord()); 96 | } 97 | 98 | export default { 99 | personnr: validerPersonnr, 100 | navn: validerNavn, 101 | adresse: validerAdresse, 102 | kjennetegn: validerKjennetegn, 103 | merke: validerMerke, 104 | ingenfeil: ingenValideringsFeil, 105 | brukernavn: validerBrukernavn, 106 | passord: validerPassord, 107 | loginn: loggInnValideringOK 108 | } -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/validering.js: -------------------------------------------------------------------------------- 1 | const validerPersonnr = () => { 2 | const personnr = $("#personnr").val(); 3 | const regexp = /^[0-9]{11}$/; 4 | const ok = regexp.test(personnr); 5 | if (!ok) { 6 | $("#feilPersonnummer").html("Personnummeret må bestå av 11 siffer"); 7 | return false; 8 | } else { 9 | $("#feilPersonnummer").html(""); 10 | return true; 11 | } 12 | } 13 | 14 | const validerNavn = () => { 15 | const navn = $("#navn").val(); 16 | const regexp = /^[a-zA-ZæøåÆØÅ. \-]{2,20}$/; 17 | const ok = regexp.test(navn); 18 | if (!ok) { 19 | $("#feilNavn").html("Navnet må bestå av 2 til 20 bokstaver"); 20 | return false; 21 | } else { 22 | $("#feilNavn").html(""); 23 | return true; 24 | } 25 | } 26 | 27 | const validerAdresse = () => { 28 | const adresse = $("#adresse").val(); 29 | const regexp = /^[0-9a-zA-ZæøåÆØÅ. \-]{2,30}$/; 30 | const ok = regexp.test(adresse); 31 | if (!ok) { 32 | $("#feilAdresse").html("Adressen må bestå av 2 til 40 bokstaver og tall"); 33 | return false; 34 | } else { 35 | $("#feilAdresse").html(""); 36 | return true; 37 | } 38 | } 39 | 40 | const validerKjennetegn = () => { 41 | const kjennetegn = $("#kjennetegn").val(); 42 | const regexp = /^[A-Z][A-Z][0-9]{5}$/; 43 | const ok = regexp.test(kjennetegn); 44 | if (!ok) { 45 | $("#feilKjennetegn").html("Kjennetegnet må ha to store bokstaver og 5 tall"); 46 | return false; 47 | } else { 48 | $("#feilKjennetegn").html(""); 49 | return true; 50 | } 51 | } 52 | 53 | const validerMerke = () => { 54 | const merke = $("#valgtMerke").val(); 55 | if (merke === "Velg merke") { 56 | $("#feilMerke").html("Velg et merke!"); 57 | return false; 58 | } else { 59 | $("#feilMerke").html(""); 60 | return true; 61 | } 62 | } 63 | 64 | const ingenValideringsFeil = () => { 65 | return (validerPersonnr() && validerNavn() && validerAdresse() && validerKjennetegn() && validerMerke()); 66 | } 67 | 68 | const validerBrukernavn = () => { 69 | const brukernavn = $("#brukernavn").val(); 70 | const regexp = /^[a-zA-ZæøåÆØÅ. \-]{2,20}$/; 71 | const ok = regexp.test(brukernavn); 72 | if (!ok) { 73 | $("#feilBrukernavn").html("Navnet må bestå av 2 til 20 bokstaver"); 74 | return false; 75 | } else { 76 | $("#feilBrukernavn").html(""); 77 | return true; 78 | } 79 | } 80 | 81 | const validerPassord = () => { 82 | const passord = $("#passord").val(); 83 | const regexp = /^(?=.*[A-ZÆØÅa-zøæå])(?=.*\d)[A-ZØÆÅa-zøæå\d]{8,}$/; 84 | const ok = regexp.test(passord); 85 | if (!ok) { 86 | $("#feilPassord").html("Passordet må være minimum 8 tegn, minst en bokstav og et tall"); 87 | return false; 88 | } else { 89 | $("#feilPassord").html(""); 90 | return true; 91 | } 92 | } 93 | 94 | const loggInnValideringOK = () => { 95 | return (validerBrukernavn && validerPassord()); 96 | } 97 | 98 | export default { 99 | personnr: validerPersonnr, 100 | navn: validerNavn, 101 | adresse: validerAdresse, 102 | kjennetegn: validerKjennetegn, 103 | merke: validerMerke, 104 | ingenfeil: ingenValideringsFeil, 105 | brukernavn: validerBrukernavn, 106 | passord: validerPassord, 107 | loginn: loggInnValideringOK 108 | } -------------------------------------------------------------------------------- /src/main/resources/schema.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE Motorvogn 2 | ( 3 | personnr INTEGER NOT NULL, 4 | navn VARCHAR(255) NOT NULL, 5 | adresse VARCHAR(255) NOT NULL, 6 | kjennetegn VARCHAR(255) NOT NULL, 7 | merke VARCHAR(255) NOT NULL, 8 | type VARCHAR(255) NOT NULL, 9 | PRIMARY KEY (personnr) 10 | ); 11 | 12 | CREATE TABLE Bil 13 | ( 14 | id INTEGER AUTO_INCREMENT NOT NULL, 15 | merke VARCHAR(255) NOT NULL, 16 | type VARCHAR(255) NOT NULL, 17 | PRIMARY KEY (id) 18 | ); 19 | 20 | -- Motorvogn6 tabeller (her har Motorvogn-tabellen en egen id som autogenereres) 21 | 22 | CREATE TABLE Motorvogn6 23 | ( 24 | id INTEGER AUTO_INCREMENT NOT NULL, 25 | personnr INTEGER NOT NULL, 26 | navn VARCHAR(255) NOT NULL, 27 | adresse VARCHAR(255) NOT NULL, 28 | kjennetegn VARCHAR(255) NOT NULL, 29 | merke VARCHAR(255) NOT NULL, 30 | type VARCHAR(255) NOT NULL, 31 | PRIMARY KEY (id) 32 | ); 33 | 34 | CREATE TABLE Bil6 35 | ( 36 | id INTEGER AUTO_INCREMENT NOT NULL, 37 | merke VARCHAR(255) NOT NULL, 38 | type VARCHAR(255) NOT NULL, 39 | PRIMARY KEY (id) 40 | ); 41 | 42 | -- Motorvogn7 tabeller (her har Motorvogn-tabellen en egen id som autogenereres) 43 | 44 | CREATE TABLE Motorvogn7 45 | ( 46 | id INTEGER AUTO_INCREMENT NOT NULL, 47 | personnr VARCHAR(255) NOT NULL, 48 | navn VARCHAR(255) NOT NULL, 49 | adresse VARCHAR(255) NOT NULL, 50 | kjennetegn VARCHAR(255) NOT NULL, 51 | merke VARCHAR(255) NOT NULL, 52 | type VARCHAR(255) NOT NULL, 53 | PRIMARY KEY (id) 54 | ); 55 | 56 | CREATE TABLE Bil7 57 | ( 58 | id INTEGER AUTO_INCREMENT NOT NULL, 59 | merke VARCHAR(255) NOT NULL, 60 | type VARCHAR(255) NOT NULL, 61 | PRIMARY KEY (id) 62 | ); 63 | 64 | -- Motorvogn8 tabeller (Sesjoner: bruker er ny) 65 | 66 | CREATE TABLE Motorvogn8 67 | ( 68 | id INTEGER AUTO_INCREMENT NOT NULL, 69 | personnr VARCHAR(255) NOT NULL, 70 | navn VARCHAR(255) NOT NULL, 71 | adresse VARCHAR(255) NOT NULL, 72 | kjennetegn VARCHAR(255) NOT NULL, 73 | merke VARCHAR(255) NOT NULL, 74 | type VARCHAR(255) NOT NULL, 75 | PRIMARY KEY (id) 76 | ); 77 | 78 | CREATE TABLE Bil8 79 | ( 80 | id INTEGER AUTO_INCREMENT NOT NULL, 81 | merke VARCHAR(255) NOT NULL, 82 | type VARCHAR(255) NOT NULL, 83 | PRIMARY KEY (id) 84 | ); 85 | 86 | CREATE TABLE Bruker8 87 | ( 88 | id INTEGER AUTO_INCREMENT NOT NULL, 89 | brukernavn VARCHAR(255) NOT NULL, 90 | passord VARCHAR(255) NOT NULL, 91 | PRIMARY KEY (id) 92 | ); 93 | 94 | -- Motorvogn9 tabeller 95 | 96 | CREATE TABLE Motorvogn9 97 | ( 98 | id INTEGER AUTO_INCREMENT NOT NULL, 99 | personnr VARCHAR(255) NOT NULL, 100 | navn VARCHAR(255) NOT NULL, 101 | adresse VARCHAR(255) NOT NULL, 102 | kjennetegn VARCHAR(255) NOT NULL, 103 | merke VARCHAR(255) NOT NULL, 104 | type VARCHAR(255) NOT NULL, 105 | PRIMARY KEY (id) 106 | ); 107 | 108 | CREATE TABLE Bil9 109 | ( 110 | id INTEGER AUTO_INCREMENT NOT NULL, 111 | merke VARCHAR(255) NOT NULL, 112 | type VARCHAR(255) NOT NULL, 113 | PRIMARY KEY (id) 114 | ); 115 | 116 | CREATE TABLE Bruker9 117 | ( 118 | id INTEGER AUTO_INCREMENT NOT NULL, 119 | brukernavn VARCHAR(255) NOT NULL, 120 | passord VARCHAR(255) NOT NULL, 121 | PRIMARY KEY (id) 122 | ); -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/inputvalidering/repository/Motorvogn7Repository.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.inputvalidering.repository; 2 | 3 | import eriksommer.webprog.inputvalidering.model.Bil; 4 | import eriksommer.webprog.inputvalidering.model.Motorvogn; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.jdbc.core.BeanPropertyRowMapper; 9 | import org.springframework.jdbc.core.JdbcTemplate; 10 | import org.springframework.stereotype.Repository; 11 | 12 | import java.util.List; 13 | 14 | @Repository 15 | @SuppressWarnings("all") 16 | public class Motorvogn7Repository { 17 | 18 | @Autowired 19 | private JdbcTemplate db; 20 | 21 | private final Logger logger = LoggerFactory.getLogger(Motorvogn7Repository.class); 22 | 23 | public boolean lagreMotorvogn(Motorvogn m) { 24 | String sql = "INSERT INTO Motorvogn7 (personnr,navn,adresse,kjennetegn,merke,type) VALUES(?,?,?,?,?,?)"; 25 | try { 26 | db.update(sql, m.getPersonnr(), m.getNavn(), m.getAdresse(), m.getKjennetegn(), m.getMerke(), m.getType()); 27 | return true; 28 | } catch (Exception e) { 29 | logger.error("Feil i lagre motorvogn " + e); 30 | return false; 31 | } 32 | } 33 | 34 | public List hentAlleMotorvogner() { 35 | String sql = "SELECT * FROM Motorvogn7"; 36 | try { 37 | return db.query(sql, new BeanPropertyRowMapper(Motorvogn.class)); 38 | } catch (Exception e) { 39 | logger.error("Feil i hent alle motorvogner " + e); 40 | return null; 41 | } 42 | } 43 | 44 | public Motorvogn henteEnMotorvogn(int id) { 45 | String sql = "SELECT * FROM Motorvogn7 WHERE id=?"; 46 | try { 47 | List enMotorvogn = db.query(sql, new BeanPropertyRowMapper(Motorvogn.class), id); 48 | return enMotorvogn.get(0); 49 | } catch (Exception e) { 50 | logger.error("Feil i hent en motorvogn " + e); 51 | return null; 52 | } 53 | } 54 | 55 | public boolean endreMotorvogn(Motorvogn m) { 56 | String sql = "UPDATE Motorvogn7 SET personnr=?, navn=?,adresse=?,kjennetegn=?,merke=?,type=? where id=?"; 57 | try { 58 | db.update(sql, m.getPersonnr(), m.getNavn(), m.getAdresse(), m.getKjennetegn(), m.getMerke(), m.getType(), m.getId()); 59 | return true; 60 | } catch (Exception e) { 61 | logger.error("Feil i endre en motorvogn " + e); 62 | return false; 63 | } 64 | } 65 | 66 | public boolean slettEnMotorvogn(String personnr) { 67 | String sql = "DELETE FROM Motorvogn7 WHERE personnr=?"; 68 | try { 69 | db.update(sql, personnr); 70 | return true; 71 | } catch (Exception e) { 72 | logger.error("Feil i slett en motorvogn" + e); 73 | return false; 74 | } 75 | } 76 | 77 | public boolean slettAlleMotorvogner() { 78 | String sql = "DELETE FROM Motorvogn7"; 79 | try { 80 | db.update(sql); 81 | return true; 82 | } catch (Exception e) { 83 | logger.error("Feil i slett alle motorvogner" + e); 84 | return false; 85 | } 86 | } 87 | 88 | public List hentAlleBiler() { 89 | String sql = "SELECT * FROM Bil7"; 90 | try { 91 | return db.query(sql, new BeanPropertyRowMapper(Bil.class)); 92 | } catch (Exception e) { 93 | return null; 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/main/java/eriksommer/webprog/relasjonsdatabase2/repository/Motorvogn6Repository.java: -------------------------------------------------------------------------------- 1 | package eriksommer.webprog.relasjonsdatabase2.repository; 2 | 3 | import eriksommer.webprog.relasjonsdatabase2.model.Bil; 4 | import eriksommer.webprog.relasjonsdatabase2.model.Motorvogn; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.jdbc.core.BeanPropertyRowMapper; 9 | import org.springframework.jdbc.core.JdbcTemplate; 10 | import org.springframework.stereotype.Repository; 11 | 12 | import java.util.List; 13 | 14 | @Repository 15 | @SuppressWarnings("all") 16 | public class Motorvogn6Repository { 17 | 18 | @Autowired 19 | private JdbcTemplate db; 20 | 21 | private final Logger logger = LoggerFactory.getLogger(Motorvogn6Repository.class); 22 | 23 | public boolean lagreMotorvogn(Motorvogn m) { 24 | String sql = "INSERT INTO Motorvogn6 (personnr,navn,adresse,kjennetegn,merke,type) VALUES(?,?,?,?,?,?)"; 25 | try { 26 | db.update(sql, m.getPersonnr(), m.getNavn(), m.getAdresse(), m.getKjennetegn(), m.getMerke(), m.getType()); 27 | return true; 28 | } catch (Exception e) { 29 | logger.error("Feil i lagre motorvogn " + e); 30 | return false; 31 | } 32 | } 33 | 34 | public List hentAlleMotorvogner() { 35 | String sql = "SELECT * FROM Motorvogn6"; 36 | try { 37 | return db.query(sql, new BeanPropertyRowMapper(Motorvogn.class)); 38 | } catch (Exception e) { 39 | logger.error("Feil i hent alle motorvogner " + e); 40 | return null; 41 | } 42 | } 43 | 44 | public Motorvogn henteEnMotorvogn(int id) { 45 | String sql = "SELECT * FROM Motorvogn6 WHERE id=?"; 46 | try { 47 | List enMotorvogn = db.query(sql, new BeanPropertyRowMapper(Motorvogn.class), id); 48 | return enMotorvogn.get(0); 49 | } catch (Exception e) { 50 | logger.error("Feil i hent en motorvogn " + e); 51 | return null; 52 | } 53 | } 54 | 55 | public boolean endreMotorvogn(Motorvogn m) { 56 | String sql = "UPDATE Motorvogn6 SET personnr=?, navn=?,adresse=?,kjennetegn=?,merke=?,type=? where id=?"; 57 | try { 58 | db.update(sql, m.getPersonnr(), m.getNavn(), m.getAdresse(), m.getKjennetegn(), m.getMerke(), m.getType(), m.getId()); 59 | return true; 60 | } catch (Exception e) { 61 | logger.error("Feil i endre en motorvogn " + e); 62 | return false; 63 | } 64 | } 65 | 66 | public boolean slettEnMotorvogn(int personnr) { 67 | String sql = "DELETE FROM Motorvogn6 WHERE personnr=?"; 68 | try { 69 | db.update(sql, personnr); 70 | return true; 71 | } catch (Exception e) { 72 | logger.error("Feil i slett en motorvogn" + e); 73 | return false; 74 | } 75 | } 76 | 77 | public boolean slettAlleMotorvogner() { 78 | String sql = "DELETE FROM Motorvogn6"; 79 | try { 80 | db.update(sql); 81 | return true; 82 | } catch (Exception e) { 83 | logger.error("Feil i slett alle motorvogner" + e); 84 | return false; 85 | } 86 | } 87 | 88 | public List hentAlleBiler() { 89 | String sql = "SELECT * FROM Bil6"; 90 | try { 91 | return db.query(sql, new BeanPropertyRowMapper(Bil.class)); 92 | } catch (Exception e) { 93 | return null; 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/main/resources/static/inputvalidering/endre.js: -------------------------------------------------------------------------------- 1 | import {apiInputvalidering as api} from "../apiurl.js" 2 | import validering from "./validering.js" 3 | 4 | $(() => { // kjøres når dokumentet er ferdig lastet 5 | hentAlleBiler(); 6 | henteEnMotorvogn(); 7 | 8 | $("#endreMotorvogn").click(() => { 9 | const motorvogn = { 10 | id: $("#id").val(), 11 | personnr: $("#personnr").val(), 12 | navn: $("#navn").val(), 13 | adresse: $("#adresse").val(), 14 | kjennetegn: $("#kjennetegn").val(), 15 | merke: $("#valgtMerke").val(), 16 | type: $("#valgtType").val(), 17 | }; 18 | 19 | if (validering.feil()) { 20 | $.post(api + "/endre", motorvogn, () => hentAlleBiler()) 21 | .fail(jqXHR => { 22 | const json = $.parseJSON(jqXHR.responseText); 23 | $("#feil").html(json.message); 24 | }); 25 | 26 | window.location.href = "index.html"; 27 | } 28 | }); 29 | 30 | $("#personnr").on("change", () => validering.personnr()); 31 | $("#navn").on("change", () => validering.navn()); 32 | $("#adresse").on("change", () => validering.adresse()); 33 | $("#kjennetegn").on("change", () => validering.kjennetegn()); 34 | 35 | }); 36 | 37 | const hentAlleBiler = () => { 38 | $.get(api + "/hentBiler", biler => formaterBiler(biler)) 39 | .fail(jqXHR => { 40 | const json = $.parseJSON(jqXHR.responseText); 41 | $("#feil").html(json.message); 42 | }); 43 | } 44 | 45 | const formaterBiler = biler => { 46 | $("#valgtMerke").off(); 47 | let ut = ""; 57 | $("#merke").html(ut); 58 | 59 | addEventListeners(biler); 60 | } 61 | 62 | const addEventListeners = biler => { 63 | for (const bil of biler) $("#valgtMerke").on("change", () => finnTyper()); 64 | } 65 | 66 | const finnTyper = () => { 67 | const valgtMerke = $("#valgtMerke").val(); 68 | $("#feilMerke").html(""); 69 | $.get(api + "/hentBiler", biler => formaterTyper(biler, valgtMerke)) 70 | .fail(jqXHR => { 71 | const json = $.parseJSON(jqXHR.responseText); 72 | $("#feil").html(json.message); 73 | }); 74 | } 75 | 76 | const formaterTyper = (biler, valgtMerke) => { 77 | let ut = ""; 84 | $("#type").html(ut); 85 | } 86 | 87 | const henteEnMotorvogn = () => { 88 | const id = window.location.search.substring(1); // kommer fra kallet i index.js 89 | const url = "/henteEnMotorvogn?id=" + id; 90 | $.get(api + url, enMotorVogn => { 91 | // overfør til input-feltene i skjemaet 92 | $("#id").val(enMotorVogn.id); // må ha med denne for å vite hvilken id 93 | $("#personnr").val(enMotorVogn.personnr); 94 | $("#navn").val(enMotorVogn.navn); 95 | $("#adresse").val(enMotorVogn.adresse); 96 | $("#kjennetegn").val(enMotorVogn.kjennetegn); 97 | $("#merke").val(enMotorVogn.merke); 98 | $("#type").val(enMotorVogn.type); 99 | }) 100 | .fail(jqXHR => { 101 | const json = $.parseJSON(jqXHR.responseText); 102 | $("#feil").html(json.message); 103 | }); 104 | } -------------------------------------------------------------------------------- /src/main/resources/static/sikkerhet/endre.js: -------------------------------------------------------------------------------- 1 | import validering from "./validering.js" 2 | import {apiSikkerhet as api} from "../apiurl.js" 3 | 4 | $(() => { // kjøres når dokumentet er ferdig lastet 5 | hentAlleBiler(); 6 | henteEnMotorvogn(); 7 | 8 | $("#endreMotorvogn").click(() => { 9 | const motorvogn = { 10 | id: $("#id").val(), 11 | personnr: $("#personnr").val(), 12 | navn: $("#navn").val(), 13 | adresse: $("#adresse").val(), 14 | kjennetegn: $("#kjennetegn").val(), 15 | merke: $("#valgtMerke").val(), 16 | type: $("#valgtType").val(), 17 | }; 18 | 19 | if (validering.ingenfeil()) { 20 | $.post(api + "/endre", motorvogn, () => { 21 | window.location.href = "/sikkerhet/liste.html"; 22 | }) 23 | .fail(jqXHR => { 24 | const json = $.parseJSON(jqXHR.responseText); 25 | $("#feil").html(json.message); 26 | }); 27 | } 28 | }) 29 | 30 | $("#personnr").on("change", () => validering.personnr()); 31 | $("#navn").on("change", () => validering.navn()); 32 | $("#adresse").on("change", () => validering.adresse()); 33 | $("#kjennetegn").on("change", () => validering.kjennetegn()); 34 | 35 | }); 36 | 37 | const hentAlleBiler = () => { 38 | $.get(api + "/hentBiler", biler => { 39 | formaterBiler(biler); 40 | }) 41 | .fail(jqXHR => { 42 | const json = $.parseJSON(jqXHR.responseText); 43 | $("#feil").html(json.message); 44 | }); 45 | } 46 | 47 | const formaterBiler = biler => { 48 | $("#valgtMerke").off(); 49 | let ut = ""; 59 | $("#merke").html(ut); 60 | 61 | addEventListeners(biler); 62 | } 63 | 64 | const addEventListeners = biler => { 65 | for (const bil of biler) $("#valgtMerke").on("change", () => finnTyper()); 66 | } 67 | 68 | const finnTyper = () => { 69 | const valgtMerke = $("#valgtMerke").val(); 70 | $("#feilMerke").html(""); 71 | $.get(api + "/hentBiler", biler => { 72 | formaterTyper(biler, valgtMerke); 73 | }) 74 | .fail(jqXHR => { 75 | const json = $.parseJSON(jqXHR.responseText); 76 | $("#feil").html(json.message); 77 | }); 78 | } 79 | 80 | const formaterTyper = (biler, valgtMerke) => { 81 | let ut = ""; 88 | $("#type").html(ut); 89 | } 90 | 91 | const henteEnMotorvogn = () => { 92 | const id = window.location.search.substring(1); // kommer fra kallet i index.js 93 | const url = "/henteEnMotorvogn?id=" + id; 94 | $.get(api + url, enMotorVogn => { 95 | // overfør til input-feltene i skjemaet 96 | $("#id").val(enMotorVogn.id); // må ha med denne for å vite hvilken id 97 | $("#personnr").val(enMotorVogn.personnr); 98 | $("#navn").val(enMotorVogn.navn); 99 | $("#adresse").val(enMotorVogn.adresse); 100 | $("#kjennetegn").val(enMotorVogn.kjennetegn); 101 | $("#merke").val(enMotorVogn.merke); 102 | $("#type").val(enMotorVogn.type); 103 | }) 104 | .fail(jqXHR => { 105 | const json = $.parseJSON(jqXHR.responseText); 106 | $("#feil").html(json.message); 107 | }); 108 | } 109 | 110 | 111 | -------------------------------------------------------------------------------- /src/main/resources/static/sesjoner/endre.js: -------------------------------------------------------------------------------- 1 | import {apiSesjoner as api} from "../apiurl.js" 2 | import validering from "./validering.js" 3 | 4 | $(() => { // kjøres når dokumentet er ferdig lastet 5 | hentAlleBiler(); 6 | henteEnMotorvogn(); 7 | 8 | $("#endreMotorvogn").click(() => { 9 | const motorvogn = { 10 | id: $("#id").val(), 11 | personnr: $("#personnr").val(), 12 | navn: $("#navn").val(), 13 | adresse: $("#adresse").val(), 14 | kjennetegn: $("#kjennetegn").val(), 15 | merke: $("#valgtMerke").val(), 16 | type: $("#valgtType").val(), 17 | }; 18 | 19 | if (validering.ingenfeil()) { 20 | $.post(api + "/endre", motorvogn, () => { 21 | hentAlleBiler(); 22 | }) 23 | .fail(jqXHR => { 24 | const json = $.parseJSON(jqXHR.responseText); 25 | $("#feil").html(json.message); 26 | }); 27 | 28 | window.location.href = "/sesjoner/liste.html"; 29 | } 30 | }) 31 | 32 | $("#personnr").on("change", () => validering.personnr()); 33 | $("#navn").on("change", () => validering.navn()); 34 | $("#adresse").on("change", () => validering.adresse()); 35 | $("#kjennetegn").on("change", () => validering.kjennetegn()); 36 | 37 | }); 38 | 39 | const hentAlleBiler = () => { 40 | $.get(api + "/hentBiler", biler => { 41 | formaterBiler(biler); 42 | }) 43 | .fail(jqXHR => { 44 | const json = $.parseJSON(jqXHR.responseText); 45 | $("#feil").html(json.message); 46 | }); 47 | } 48 | 49 | const formaterBiler = biler => { 50 | $("#valgtMerke").off(); 51 | let ut = ""; 61 | $("#merke").html(ut); 62 | 63 | addEventListeners(biler); 64 | } 65 | 66 | const addEventListeners = biler => { 67 | for (const bil of biler) $("#valgtMerke").on("change", () => finnTyper()); 68 | } 69 | 70 | const finnTyper = () => { 71 | const valgtMerke = $("#valgtMerke").val(); 72 | $("#feilMerke").html(""); 73 | $.get(api + "/hentBiler", biler => { 74 | formaterTyper(biler, valgtMerke); 75 | }) 76 | .fail(jqXHR => { 77 | const json = $.parseJSON(jqXHR.responseText); 78 | $("#feil").html(json.message); 79 | }); 80 | } 81 | 82 | const formaterTyper = (biler, valgtMerke) => { 83 | let ut = ""; 90 | $("#type").html(ut); 91 | } 92 | 93 | const henteEnMotorvogn = () => { 94 | const id = window.location.search.substring(1); // kommer fra kallet i index.js 95 | const url = "/henteEnMotorvogn?id=" + id; 96 | $.get(api + url, enMotorVogn => { 97 | // overfør til input-feltene i skjemaet 98 | $("#id").val(enMotorVogn.id); // må ha med denne for å vite hvilken id 99 | $("#personnr").val(enMotorVogn.personnr); 100 | $("#navn").val(enMotorVogn.navn); 101 | $("#adresse").val(enMotorVogn.adresse); 102 | $("#kjennetegn").val(enMotorVogn.kjennetegn); 103 | $("#merke").val(enMotorVogn.merke); 104 | $("#type").val(enMotorVogn.type); 105 | }) 106 | .fail(jqXHR => { 107 | const json = $.parseJSON(jqXHR.responseText); 108 | $("#feil").html(json.message); 109 | }); 110 | } --------------------------------------------------------------------------------