06.Jsp

Jsp概述

Jsp(全称JavaServer Pages),是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
jsp页面可以包含HTML+Css+JS+java 代码

Jsp本质

Jsp的本质是一个servlet,在它运行的时候,服务器会将他编译成Servlet,可以在tomcat服务器中的Work目录中找到与之对应的servlet。
项目的web目录下有一个index.jsp.
在这里插入图片描述
index.jsp页面改成了index_jsp.java文件
在这里插入图片描述
虽然jsp可以做与servlet一样的事,但为了分工明确,servlet用于做请求处理,jsp用于页面显示。

Java 脚本

在jsp页面中使用Java代码需要插入Java脚本,有三种方式:

方式一:
<%! java 代码%>

这段Java代码会被Servlet编译到成员位置,只会编译执行一次,可以定义成员变量和成员方法

方式二:
<% java 代码 %>

这种方式的脚本,Java代码会被插入到service方法中,相当于servlet的局部变量,每次请求都会执行一次。可以用此定义局部变量和逻辑代码

方式三:
 <%="java表达式"%>

该Java脚本是用于显示输出的,类似于response.getWrite().print(),能够打印的都能在这里输出,所以里面能写 常量,变量,和表达式。

Java指令

java指令就是告诉服务器如何将这个jsp页面编译成servlet,常用的三个Java指令:

指令1<%@ page  %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

Language: 告诉服务器这个jsp页面所嵌套用的语言
Import: 页面所要导入的Java包
pageEncoding: 这个指令是告诉服务器用什么方式解码,如"UTF-8",tomcat默认使用ISO-8859-1解码
contentType 指定本jsp所用的编码方式, 这个两个用来解决Jsp乱码问题.但其实只要设置pageEncoding就行了,在往这个页面输出数据时,会默认用pageEncoding指定的码表
Errorage: 当前页面出现了错误之后,跳转到指定页面
isErrorPage: 当前页面是否为错误页面,默认为false
buffer: 设置jspwriter流的缓存区大小
isElgnored: 是否忽略EL表达式,默认是false,不忽略

指令二:
<%@include file="" %>

该指令用来做页面的静态包含。效果类似于将包含页面代码全部拷过来,两个jsp页面只会产生一个java源文件.

指令三:
<%@taglib  %>

这个指令是告诉jsp导入的标签库

Jsp九大内置对象

  • PageContext pageContext
  • HttpServletRequest request
  • HttpSession session
  • ServletContext application
  • HttpServletResponse response
  • ServletConfig config
  • JspWriter out
  • Object page
  • Exception

page对象:就是jsp对象本身,作用不大

Exception:对象不会自动传入jsp页面,只有当设置该页面为错误页面才会传入该对象,设置方式为<%@page isErrorPage=“true” %>

JspWrite对象:需要依靠respond对象输出数据,当Jspwrite对象缓存区满了,它会将数据刷入respond的缓存区,由respond输出,page指令的buffer属性可以设置JspWrite的缓存大小,不要与respond对象一起使用,否则会出现数据紊乱。

pageContext对象: 当前页面的上下文对象,最小的域对象,它的最大作用在于封装了其他八个内置对象,在某些场景需要九个内置对象时,把pageContext传过去就可以了。

Jsp内置动作标签

<jsp:forward >转发标签

<jsp:forward page="/login.jsp"></jsp:forward>

可以实现转发,效果类似于request.getRequestDispatcher("/login.jsp").forward(request, response);如果要携带参数需要使用< jsp:param>标签

< jsp:param>参数标签

<jsp:param value="zhangsan" name="username"/> //传递了一个名为username,值为zhangsan的参数
<jsp:forward page="/login.jsp">
		<jsp:param value="zhangsan" name="username"/>
</jsp:forward>

效果类似于request.getRequestDispatcher("/login.jsp?username=zhangsan").forward(request, response);

< jsp:include/>动态包含标签:

 <jsp:include page="skip.jsp">
 	<jsp:param value="zhangsan" name="username"/>//传递给包含页面参数
</jsp:include >

效果<%@include %>指令类似,但动态包含会产生两个Java源文件

<think>好的,我需要帮用户解决在Struts2框架下使用动态方法调用实现UserAction中login和register方法的问题,同时要将用户信息存入session。首先,我需要理清楚用户的目录结构和需求。 用户的项目结构是SSH06,里面有src和WebContent目录。src下有个UserAction.java,在com.seehope.action包中,还有struts.xml。WebContent下有四个JSP页面,需要处理登录、注册、成功和错误页面。用户要求用动态方法调用,也就是在URL中通过感叹号指定方法名,比如UserAction!login。 首先,我得确认Struts2的动态方法调用是否开启。默认情况下,Struts2.5之后可能关闭了动态方法调用,需要在struts.xml中配置常量开启。需要添加<constant name="struts.enable.DynamicMethodInvocation" value="true" />。 接下来是UserAction类的编写。用户需要login和register两个方法,这两个方法需要处理表单提交的数据,并将数据存入session。这里需要注意,Action类中应该使用属性来接收表单参数,所以需要为姓名、密码、学号、性别、班级、院系、城市、简历等字段创建对应的属性,并提供getter和setter方法。 然后,每个方法(login和register)执行后,需要将用户信息存入session。在Struts2中,可以通过ActionContext.getContext().getSession()来获取session对象,然后将数据以键值对形式存入。 接下来是配置struts.xml。需要为UserAction配置一个package,指定命名空间,然后定义action的name为User,class指向UserAction。因为使用动态方法调用,所以不需要在action标签内定义method属性,而是通过URL中的方法名来调用对应的方法。每个方法的结果需要映射到对应的JSP页面,比如login返回success跳转到success.jsp,register返回success也可能跳转到success.jsp,或者其他页面,这里可能需要用户确认,但根据给出的JSP文件,可能登录和注册成功都跳转到success.jsp,失败到error.jsp。 然后是JSP页面的表单部分。login.jsp和register.jsp的表单action需要指向UserAction!login和UserAction!register,方法分别为post。表单中的输入字段的name属性需要与UserAction中的属性名一致,比如name="username",这样Struts2才能自动注入值。 在success.jsp中,需要从session中取出用户信息并显示。可以使用EL表达式,比如${sessionScope.username}来显示用户名。同样,其他字段如学号、性别等也需要这样显示。 还需要检查web.xml是否正确配置了Struts2的过滤器,确保所有请求都经过Struts2处理。另外,依赖的JAR包是否齐全,比如struts2-core、xwork等,这些都需要放在WEB-INF/lib目录下。 可能遇到的问题包括动态方法调用未开启导致404错误,或者表单字段与Action属性名不匹配导致数据无法注入。此外,如果使用的是较新的Struts2版本,可能需要额外的配置来允许动态方法调用,或者使用通配符映射作为替代方案。 最后,测试整个流程,确保提交表单后能正确调用对应的方法,数据存入session,并跳转到正确的页面,显示用户信息。如果有错误,检查控制台日志,看是否有异常信息,比如方法找不到或者属性无法注入。</think>根据项目结构要求,以下是使用Struts2动态方法调用的实现步骤: 一、目录结构补充说明 ``` SSH06/ ├── src/ │ └── com/ │ └── seehope/ │ ├── action/ │ │ └── UserAction.java │ └── struts.xml └── WebContent/ ├── WEB-INF/ │ ├── lib/ │ └── web.xml ├── login.jsp ├── register.jsp ├── success.jsp └── error.jsp ``` 二、核心代码实现 1. UserAction.java ```java package com.seehope.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import java.util.Map; public class UserAction extends ActionSupport { // 表单字段 private String username; private String password; private String studentId; private String gender; private String className; private String department; private String city; private String resume; // 必须提供getter/setter public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } // 其他字段的getter/setter类似... public String login() { Map<String, Object> session = ActionContext.getContext().getSession(); session.put("userInfo", this); // 将整个Action对象存入session return SUCCESS; } public String register() { Map<String, Object> session = ActionContext.getContext().getSession(); session.put("username", username); session.put("studentId", studentId); session.put("department", department); // 其他字段存储方式相同... return SUCCESS; } } ``` 2. struts.xml 配置 ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 开启动态方法调用 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <package name="user" namespace="/" extends="struts-default"> <action name="User" class="com.seehope.action.UserAction"> <result name="success">/success.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts> ``` 三、JSP页面示例 1. login.jsp(片段) ```jsp <form action="User!login" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="登录"> </form> ``` 2. register.jsp(片段) ```jsp <form action="User!register" method="post"> 学号:<input type="text" name="studentId"><br> 院系:<input type="text" name="department"><br> <!-- 其他字段... --> <input type="submit" value="注册"> </form> ``` 3. success.jsp(显示session数据) ```jsp <h3>用户信息:</h3> <p>姓名:${sessionScope.username}</p> <p>学号:${sessionScope.studentId}</p> <p>院系:${sessionScope.department}</p> <!-- 其他字段显示方式相同 --> ``` 四、实施步骤说明 1. 配置依赖:确保WEB-INF/lib包含 - struts2-core-2.5.x.jar - xwork-core-2.3.x.jar - ognl-3.x.x.jar - 其他Struts2依赖 2. web.xml 配置过滤器: ```xml <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 五、验证测试 1. 访问路径: - 登录:`http://localhost:8080/SSH06/login.jsp` - 注册:`http://localhost:8080/SSH06/register.jsp` 2. 动态方法调用验证: - 登录提交地址:`User!login` - 注册提交地址:`User!register` 六、注意事项 1. 安全增强建议: ```xml <!-- 在struts.xml中添加安全配置 --> <constant name="struts.excludedClasses" value="java.lang.Object,java.lang.Throwable,com.opensymphony.xwork2.ActionSupport" /> ``` 2. 中文乱码处理: 在web.xml中添加: ```xml <filter> <filter-name>encoding</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>struts.i18n.encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> ``` 3. 建议使用通配符映射作为备选方案: ```xml <action name="User_*" class="com.seehope.action.UserAction" method="{1}"> <!-- 结果配置保持不变 --> </action> ``` 如遇到动态方法调用失效问题,请检查Struts2版本是否为2.5+,建议使用`method={1}`通配符方式替代动态方法调用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值