讲解 请求路径问题


请求路径由两部分构成:资源路径与资源名称。即

         请求路径 = 资源路径 + 资源名称

资源路径与资源名称的分水岭为:请求路径中的最后一个斜杠。斜杠前的部分称为资源路径,斜杠后的部分称为资源名称。例如:

 请求路径:  http://localhost:8888/01-primary/some.do

 资源路径:  http://localhost:8888/01-primary

资源名称:  some.do



根据是否可以唯一的定位一个资源标准,可以将路径划分为两类:绝对路径与相对路径。

绝对路径:可以唯一的定位一个资源。在Web应用中,一般情况下,以请求协议开头的路径为绝对路径。绝对路径以URL形式表示。

相对路径:仅仅依靠此路径,无法唯一的定位一个资源。但若将其再与一个参照路径相结合后,就可以转换为一个可以定位资源的绝对路径,这样的路径,称为相对路径。在Web应用中,一般情况下,不以请求协议开头的路径为相对路径。相对路径以URI形式表示。

 转换关系:     绝对路径 = 参照路径 + 相对路径


以相对路径是否以斜杠开头划分,可以将相对路径划分为两类:以斜杠开头的相对路径,与不以斜杠开头的相对路径。

         对于以斜杠开头的相对路径,再根据路径出现的位置的不同,可以划分为两类:前台路径与后台路径。

前台路径:出现在HTML文件,及JSP文件的静态部分中的以斜杠开头的相对路径,称为前台路径。例如,出现在<img/>的src中的路径、<a/>的href中的路径、<form/>的action中的路径、<script/>的src等前台路径的解析者是浏览器。

后台路径:出现在Java代码、JSP文件的动态部分、及XML、Properties等配置文件中的以斜杠开头的相对路径,称为后台路径。后台路径的解析者是服务器。

不以斜杠开头的相对路径,其路径解析者,根据路径出现的位置不同,分别可以是浏览器或服务器。


不同的路径解析者,对同一个相对路径的解析结果是不同的。当然,所谓解析结果,指的是将相对路径转换为的最终的绝对路径。由于绝对路径 = 参照路径 + 相对路径,所以这里的解析规则,就是指为这个相对路径匹配上一个怎样的对照路径。或者说,我们要学习的重点是,浏览器、服务器对相对路径所匹配的参照路径是谁。

前台路径:其参照路径为当前Web服务器的根。

后台路径:其参照路径为当前Web应用的根。

不以斜杠开头的相对路径:其参照路径为当前请求路径的资源路径

http://localhost:8888/01-primary/xxx/some.do

http://localhost:8888  当前Web服务器的根。

http://localhost:8888/01-primary  Web应用的根

http://localhost:8888/01-primary/xxx/ /资源路径


资源定义路径:绝对路径

资源请求路径:参照路径+相对路径

只有当资源定义路径=资源请求路径  才能访问资源。


我的总结:jsp及静态页面不加"/"       java及配置文件中加"/"

Response的sendRedirect()方法中的以斜杠开头的相对路径,按照前面的定义,其为后台路径。后台路径的参照路径应为当前WEB应用的根,但实际却不是,而是当前WEB服务器的根。

webconent 下写jsp登录页面跳转 用"/",    ${pageContext.request.contextPath}"/  "









  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以,我会详细地讲解一下这个问题。 首先,这个问题要求我们搭建一个基于Spring MVC的Web应用程序,实现以下功能: 1. 模拟登录验证,客户端输入用户名、密码后提交,服务器对其进行验证,如果登录成功跳转到success页面显示用户名;如果登录失败返回登录页面,并在用户名输入框显示用户登录名; 2. 模拟数据请求,浏览器输入获得班级学生请求,服务器推送多个学生信息,并在页面以复选框表格的形式显示;客户端勾选若干学生后提交数据,服务器获得学生信息后跳转到selected页面,以表格形式显示选的学生列表; 3. (选作)模拟学生注册,客户端输入学生基本信息,上传照片,提交到服务器后跳转到新页面,以表格形式显示学生信息和照片。 下面是一个简单的实现方案: 1. 模拟登录验证 首先,我们需要创建一个用户登录页面login.html,它包含一个表单,用户可以在表单输入用户名和密码,并将其提交到服务器进行验证。如果验证成功,服务器将重定向到success.html页面,并在页面上显示用户名;否则,服务器将重定向到login.html页面,并在用户名输入框显示用户登录名。 login.html代码示例: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>Login</h1> <form action="/login" method="post"> <label for="username">Username:</label> <input type="text" id="username" name="username" value="${username}" /> <br> <label for="password">Password:</label> <input type="password" id="password" name="password" /> <br> <input type="submit" value="Login" /> </form> </body> </html> ``` 其,`${username}`是Thymeleaf的表达式语言,它将在服务器端渲染时被替换成登录时输入的用户名。 接下来,我们需要创建一个控制器LoginController,它处理对/login路径的POST请求,验证用户名和密码。如果验证成功,控制器将返回success.html页面;否则,控制器将返回login.html页面,并在模型添加用户名,以便在用户名输入框显示。 LoginController代码示例: ``` @Controller public class LoginController { @PostMapping("/login") public String login(@RequestParam String username, @RequestParam String password, Model model) { if ("zhangsan".equals(username) && "123".equals(password)) { model.addAttribute("username", username); return "redirect:/success"; } else { model.addAttribute("username", username); return "redirect:/login"; } } } ``` 其,@PostMapping("/login")表示该方法处理对/login路径的POST请求;@RequestParam注解表示请求参数获取username和password参数的值;Model参数用于向模型添加属性。 最后,我们需要创建success.html页面,它包含一个欢迎信息,显示登录成功的用户名。 success.html代码示例: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Success</title> </head> <body> <h1>Welcome ${username}!</h1> </body> </html> ``` 其,${username}是Thymeleaf的表达式语言,它将在服务器端渲染时被替换成登录成功的用户名。 2. 模拟数据请求 首先,我们需要创建一个学生实体类Student,它包含学生的id、姓名和是否选等属性。 Student.java代码示例: ``` public class Student { private int id; private String name; private boolean selected; public Student(int id, String name) { this.id = id; this.name = name; } // getter and setter methods } ``` 接下来,我们需要创建一个控制器StudentController,它处理对/students路径的GET请求,返回所有学生的列表,以及对/selected路径的POST请求,处理选学生的列表,然后重定向到selected.html页面,以显示选的学生列表。 StudentController代码示例: ``` @Controller public class StudentController { @GetMapping("/students") public String students(Model model) { List<Student> students = new ArrayList<>(); students.add(new Student(1, "张三")); students.add(new Student(2, "李四")); students.add(new Student(3, "王五")); model.addAttribute("students", students); return "students"; } @PostMapping("/selected") public String selected(@RequestParam List<Integer> ids) { // process selected student ids return "redirect:/selected"; } } ``` 其,@GetMapping("/students")表示该方法处理对/students路径的GET请求;@PostMapping("/selected")表示该方法处理对/selected路径的POST请求;@RequestParam注解表示请求参数获取选的学生id列表。在students方法,我们创建了一个学生列表,并将其添加到模型,以便在students.html页面进行显示。在selected方法,我们处理选的学生id列表,并重定向到selected.html页面。 接下来,我们需要创建students.html页面,它包含一个复选框表格,显示所有学生的列表,并允许用户选择多个学生。当用户提交选的学生时,将其作为POST请求发送到/selected路径。 students.html代码示例: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Students</title> </head> <body> <h1>Students</h1> <form action="/selected" method="post"> <table> <thead> <tr> <th>Id</th> <th>Name</th> <th>Select</th> </tr> </thead> <tbody> <tr th:each="student : ${students}"> <td th:text="${student.id}"></td> <td th:text="${student.name}"></td> <td><input type="checkbox" name="ids" th:value="${student.id}" /></td> </tr> </tbody> </table> <input type="submit" value="Submit" /> </form> </body> </html> ``` 其,th:each属性是Thymeleaf的迭代器,允许我们对学生列表进行迭代;th:text属性是Thymeleaf的表达式语言,它将在服务器端渲染时被替换成学生的属性值;th:value属性是Thymeleaf的表达式语言,它将在服务器端渲染时被替换成学生的id,以便在POST请求获取选的学生id列表。 最后,我们需要创建selected.html页面,它包含一个表格,显示选的学生列表。 selected.html代码示例: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Selected Students</title> </head> <body> <h1>Selected Students</h1> <table> <thead> <tr> <th>Id</th> <th>Name</th> </tr> </thead> <tbody> <tr th:each="student : ${selected}"> <td th:text="${student.id}"></td> <td th:text="${student.name}"></td> </tr> </tbody> </table> </body> </html> ``` 其,${selected}是Thymeleaf的表达式语言,它将在服务器端渲染时被替换成选的学生列表。 3. 模拟学生注册 这是一个选作问题,可以略过。 总结 这个问题要求我们搭建一个基于Spring MVC的Web应用程序,实现模拟登录验证和数据请求功能。为了实现这些功能,我们创建了两个控制器LoginController和StudentController,并创建了三个视图login.html、success.html和students.html,并在服务器端使用Thymeleaf模板引擎进行渲染。在这个过程,我们还学习了如何处理POST请求、从请求参数获取值、向模型添加属性、重定向到其他页面等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值